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

Check if a string isn't nil or empty in Lua

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

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

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

如果测试改为两个,是否可以将这段代码简化为一个?


您可以做的一件简单的事情就是抽象函数内部的测试。

1
2
3
4
5
6
7
local function isempty(s)
  return s == nil or s == ''
end

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


Can this code be simplified in one if test instead two?

nil''是不同的值。 如果您需要测试s都不是IMO,则应该将两者进行比较,因为这可以使您的意图最清晰。

那和一些替代方案,以及它们生成的字节码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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中(无论如何在我的机器上)最快的,但是差别很小。 为了清楚起见,我会选择第一个。