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