Moonsharp pairs(...) 报错"bad argument #1 to 'next' (table expected, got string)"

我不明白为什么会发生这种情况。 我正在使用 Moonsharp 在我的应用程序中运行 LUA 脚本,并创建了一个名为 IN(v, ...) 的 LUA 函数,我想使用 pairs 来迭代 ... 参数。

IN('param1', 'param2', 'param1') -- 期望返回 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" bad argument #1 to 'next' (table expected, got string)

因此,我决定检查“...”变量中是否存在一个字符串,而不是表格。

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

在 C# 中返回的值是包含 'param2' 和 'param1' 的 2 个值的元组,因此它应该能够使用 pairs 或 ipairs,不是吗?

提前感谢。

点赞
用户2858170
用户2858170

使用您所示的定义:

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中已更改vararg系统 https://www.lua.org/manual/5.1/manual.html#7.1

vararg系统从带有额外参数的表的伪参数arg更改为vararg表达式。 (请参见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-20 15:39:04