1

我不明白为什么会这样。我正在使用 Moonsharp 在我的应用程序中运行 LUA 脚本,我创建了一个 LUA 函数 IN(v, ...) 并且我想用对迭代 ... 参数。

IN('param1', 'param2', 'param1') -- expected it to return true
function IN(v, ...)
    local args = ...
    local res = true
    for i, v in pairs(args) do
        if valueIn == v then
            res = true
            break
        end
    end
    return res
end

如果它被调用,我会收到以下异常:

“MoonSharp.Interpreter.ScriptRuntimeException”错误参数 #1 到“下一个”(表预期,得到字符串)

所以我决定检查我的 ... 变量中是否有一个字符串而不是一个表。

function args(v, ...)
    return ...
end

C# 中的返回值是具有 'param2' 和 'param1' 的 2 个值的元组,因此它应该与对或 ipairs 一起使用,不是吗?

提前致谢。

4

1 回答 1

5

在您的示例中使用此定义:

function test(...)
  local arg = ...
end

并打电话

test(1,2,3)

将导致

local arg = 1, 2, 3

这当然只将 1 分配给 arg。其余部分省略。

但是由于表构造函数...作为输入,您可以编写

local arg = {...}或者然后愉快地迭代您的新表 arg。 ...不是 lua 刚刚告诉你的表。因此你不能迭代...

或者,本地arg = table.pack(...)也可以工作。

Lua 5.1 中的可变参数系统已更改,以防您好奇 https://www.lua.org/manual/5.1/manual.html#7.1

可变参数系统从带有额外参数的表的伪参数 arg 更改为可变参数表达式。(参见 luaconf.h 中的编译时选项 LUA_COMPAT_VARARG。)

在你可以做类似的事情之前

function test(...)

  for k,v in pairs(arg) do
    print("I'm a generic for loop yeah!!!")
  end

end

所以local arg = {...}没有必要。

于 2017-07-20T15:39:04.893 回答