Moonsharp对(...)引发异常"不良参数#1到' next' (表预期,得到字符串)"

时间:2017-07-20 15:13:12

标签: c# lua moonsharp

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

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到' next' (表格预期,得到字符串)

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

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

C#中的返回值是2个值的元组,其中' param2'和' param1',所以它应该与成对或ipairs一起工作,不应该吗?

提前致谢。

1 个答案:

答案 0 :(得分:4)

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

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 = {...}不是必需的。