【问题标题】:Moonsharp pairs(...) raises exception "bad argument #1 to 'next' (table expected, got string)"Moonsharp 对(...)引发异常“错误参数 #1 到 'next'(表预期,得到字符串)”
【发布时间】:2017-12-26 09:22:10
【问题描述】:

我不明白为什么会这样。 我正在使用 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” 'next' 的错误参数 #1(预期的表,得到字符串)

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

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

C# 中的返回值是一个包含 'param2' 和 'param1' 的 2 个值的元组,所以它应该适用于对或 ipairs,不是吗?

提前致谢。

【问题讨论】:

  • pairs 在一张桌子上操作,也许你的意思是local args = {...}

标签: c# lua moonsharp


【解决方案1】:

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

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

【讨论】:

  • 只是为了充分理解这一点。如果不是桌子,它本身是……什么样的对象?
  • @georgpoweleit 它是一个计算值列表的表达式。类似于返回多个值的函数调用。也许这值得一读:lua-users.org/wiki/VarargTheSecondClassCitizen
猜你喜欢
  • 2023-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-18
  • 2018-03-21
  • 2016-04-29
  • 2020-05-19
相关资源
最近更新 更多