检查 Lua 中的字符串是空还是空

我目前有一些 Lua 代码,它们使用以下语法:

if (foo == nil or foo == '') then
foo = "some default value"
end

If 条件的目标是测试 foo,它既不是空字符串,也不是 nil 值。

如果测试两次,这段代码可以简化为一次吗?

204177 次浏览

您可以做的一件简单的事情是将测试抽象到一个函数中。

local function isempty(s)
return s == nil or s == ''
end


if isempty(foo) then
foo = "default value"
end

如果测试两次,这段代码可以简化为一次吗?

nil''是不同的值。如果你需要测试的 s都不是,你应该只是比较两者,因为它使你的意图最清楚。

除此之外,还有一些替代方案,以及它们生成的字节码:

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(在我的机器上)中最快的,但是差别很小。为了清楚起见,我会选第一个。