現在、次の構文を使用したLuaコードがいくつかあります。
if (foo == nil or foo == '') then
foo = "some default value"
end
If条件の目標は、fooをテストすることであり、空の文字列でも、nil値でもありません。
このコードは、テストを2つではなく1つに簡略化できますか?
簡単にできることの1つは、関数内のテストを抽象化することです。
local function isempty(s)
return s == nil or s == ''
end
if isempty(foo) then
foo = "default value"
end
このコードは、テストを2つではなく1つに簡略化できますか?
nil
および''
は異なる値です。 s
がどちらでもないことをテストする必要がある場合、IMOは両方を比較する必要があります。これは意図が最も明確になるためです。
それと、生成されたバイトコードを使用したいくつかの選択肢:
if not foo or foo == '' then end
GETGLOBAL 0 -1 ; foo
TEST 0 0 0
JMP 3 ; to 7
GETGLOBAL 0 -1 ; foo
EQ 0 0 -2 ; - ""
JMP 0 ; to 7
if foo == nil or foo == '' then end
GETGLOBAL 0 -1 ; foo
EQ 1 0 -2 ; - nil
JMP 3 ; to 7
GETGLOBAL 0 -1 ; foo
EQ 0 0 -3 ; - ""
JMP 0 ; to 7
if (foo or '') == '' then end
GETGLOBAL 0 -1 ; foo
TEST 0 0 1
JMP 1 ; to 5
LOADK 0 -2 ; ""
EQ 0 0 -2 ; - ""
JMP 0 ; to 7
2番目はLua 5.1および5.2(とにかく私のマシン上)で最速ですが、違いはわずかです。わかりやすくするために、最初に行きます。