【问题标题】:Strange if statement in LuaLua中奇怪的if语句
【发布时间】:2013-11-29 14:40:32
【问题描述】:

好吧,我是 Lua 语言的新手,所以这可能是一个超级愚蠢的问题,但我遇到了以下语句,但我不知道它是什么意思(即使经过一些搜索)

if (...) then

   -- Doing some stuff

end

... 是什么意思?

【问题讨论】:

标签: if-statement lua


【解决方案1】:

... 用于vararg functions。它的值是所有“额外”参数的列表(即当前函数的最后一个命名参数之后的参数。)

(...)(与括号中的任何其他表达式一样)将结果调整为一个值(列表中的第一个值。)

所以if 语句实际上意味着“如果第一个可变参数存在并且不是falsenil。”

例子:

local function f1(...)
  if (...) then
    return true
  else
    return false
  end
end

local function f2(x, ...)
  if (...) then
    return true
  else
    return false
  end
end

print(f1())       -- false
print(f1(1))      -- true
print(f1(1, 2))   -- true
print(f1(1, nil)) -- true
print(f1(nil, 2)) -- false

print(f2())       -- false
print(f2(1))      -- false
print(f2(1, 2))   -- true
print(f2(1, nil)) -- false
print(f2(nil, 2)) -- true

在顶层(即不在function . . . end 表单内)它仍然以相同的方式工作,但当前函数是一个(即脚本或模块。)

如果是模块,(...) 给出模块名称。但是if(...) 测试将没有用,因为第一个参数始终是一个字符串。

如果是脚本,(...) 会给出第一个命令行参数(if(...) 会测试是否给出了任何参数。)

【讨论】:

  • 我会注意到 if (...) thenif ... then 完全相同,因为该语句本身会将列表调整为一个元素。
【解决方案2】:

...用在函数参数中,表示函数是可变参数的。它可以在函数内部用作表达式,表示函数的额外参数。

例如,这个函数接受一个固定参数加上可变参数:

function vafun(num, ...)
    if (...) then
        for _, v in ipairs{...} do
            print(v)
        end
    else
        print("empty var")
    end
end

if(...) 测试变量参数部分是否为空。

vafun(3, 4, 5)
vafun(3)
vafun()

输出:

4
5
empty var
empty var

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 2020-09-09
    相关资源
    最近更新 更多