Lua参数和数字

我知道这是粗糙的代码,但我收到了“Bad argument #2 to 'format' (number expected, got no value)”的错误提示。这与以下代码片段有关,该代码片段为所有其他代码添加前缀:

function InputConsole(...)
    Console_Input(string.format(unpack(arg)))
end

最后,这是用于游戏Command and Conquer Renegade的(如果您想查找API等)。如能帮助我找出我做错了什么,将不胜感激。

点赞
用户68204
用户68204

这段代码的问题可能是在函数InputConsole()中使用了已弃用的arg特性。Lua 5.0使用arg作为一种访问使用参数列表中的...标记声明为可变参数的函数实际参数的方法。

编辑:但“可能”并不意味着正确。

实际的问题似乎是从PlayerId切换到pID的习语。前者是函数OnChat()的命名参数,而后者是在函数体中使用的全局变量,没有进一步的初始化。未初始化的全局变量是nil,因此传递nilInputConsole(),错误消息告诉你实情。

旧答案未解决

Lua 5.1已弃用了该用法,Lua 5.2则完全删除了它。

根据提供的代码片段,我不确定实际使用的是哪个版本的Lua,但症状与缺少自动生成的arg表一致。

我会像这样编写函数:

function InputConsole(...)
    Console_Input(string.format(...))
}

但是您也可以将local arg = {...}添加为函数的第一行,并以创建(和丢弃)临时表的代价获得与Lua 5.0提供的相同效果。差异微小,主要与表中nil的处理有关。

为了清晰起见,我更喜欢在第一个参数上命名,因为它实际上并不是可选的。

function InputConsole(fmt, ...)
    Console_Input(string.format(fmt, ...))
end

如果您可以对该参数进行字符串计数,那么可以进一步简化为

function InputConsole(fmt,...)
    Console_Input(fmt:format(...))
end

如果担心其字符串性质,请在调用Console_Input()之前说fmt = tostring(fmt)或可能是assert(type(fmt) ==“string”)

2013-04-03 20:43:12