我目前有一些使用以下语法的 Lua 代码:
if (foo == nil or foo == '') then
foo = "some default value"
end
if 条件的目标是测试 foo 既不是空字符串,也不是 nil 值。
如果测试而不是两个,可以将此代码简化为一个吗?
您可以做的一件简单的事情是在函数中抽象测试。
local function isempty(s)
return s == nil or s == ''
end
if isempty(foo) then
foo = "default value"
end
如果测试而不是两个,可以将此代码简化为一个吗?
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
第二个在 Lua 5.1 和 5.2 中是最快的(无论如何在我的机器上),但差别很小。为了清楚起见,我会选择第一个。