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