检查Lua中的字符串是否为空或空

Usk*_*ver 33 string lua

我目前使用以下语法编写了一些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)

  • 你可以使用`string.len`函数.但要检查它是否大于零做`s~ =''`也可以. (3认同)

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

  • 当`foo`为'false`时,第一个和第三个与第二个不同. (5认同)
  • 这不是一个坏主意.Lua字符串在内部保持其长度,因此您不必计算字符数.但Lua也实习字符串,因此检查相等性也不需要查看字符; 你只需检查对象是否相同.所以两者都应该*很快,但事实证明,检索字符串长度的代码路径比代码路径略长,以便将两个对象指针从VM堆栈中移除以进行比较,因此`#foo == 0`是慢于'foo ==''`在5.1中有点慢,在5.2和5.3中有很多(由我的机器上的基准测试确定). (3认同)