在Lua中,检查一个字符串是否不为nil或空字符串。

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

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

if 条件的目的是测试 foo 不是空字符串,也不是 nil 值。

这段代码能否简化为一个 if 测试而不是两个?

点赞
用户90511
用户90511

你可以做的一个简单的事情就是在一个函数中将测试进行抽象化。

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

if isempty(foo) then
  foo = "默认值"
end
2013-10-29 19:31:46
用户501459
用户501459

这段代码能否用一个 if 测试来简化而不是两个?

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 中第二个方案最快,但是差异微小。为了清晰起见,我会选择第一个方案。

2013-10-29 21:25:48