64

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

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

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

如果测试而不是两个,可以将此代码简化为一个吗?

4

2 回答 2

79

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

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

if isempty(foo) then
  foo = "default value"
end
于 2013-10-29T19:31:46.157 回答
17

如果测试而不是两个,可以将此代码简化为一个吗?

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

于 2013-10-29T21:25:48.610 回答