8
function tell(num,...)
    print("value of implicit table:",arg)
    --print("value of implicit table:",...)
    select(1,arg)
    --select(1,...)
end
tell(12,43,12,55)

为什么...在表达式中使用会导致arg值为
例如nilwith print("value of implicit table:",...)or select(1,...)

4

1 回答 1

14

Lua 5.1 正式弃用arg表作为可变参数,更喜欢.... 但是,Lua 本身有一个编译时选项LUA_COMPAT_VARARG,允许arg在 5.1 代码中使用。

如果LUA_COMPAT_VARARG在编译 Lua 时定义,arg则将在 varargs 函数中创建一个表,并用参数填充 - 除非编译器检测到...函数内部的使用。在这种情况下,它假定您使用的是 5.1 样式的 varargs 而不是 5.0,并且不会创建表。但是,它仍然会创建本地命名的arg!

这样做的结果是,如果定义了,在主体中LUA_COMPAT_VARARG不使用的可变参数函数会得到一个包含参数列表,而可变参数函数得到一个包含参数列表。此错误存在于 5.1 的所有版本中,特别是,如果在编译时定义,则无法访问从任何 varargs 函数命名的全局或上值。...local arglocal argnilargLUA_COMPAT_VARARG

Lua 5.2arg完全放弃了对 -style varargs 的支持,因此无论在编译时如何配置,都没有这个问题。

(来源: Lua 5.1 参考手册第 7.1 节中提到了5.0 和 5.1 之间 varargs 处理的变化以及LUA_COMPAT_VARARG选项。该手册将您引向 luaconf.h。就我而言,任何地方都没有记录确切的行为'我知道;可以通过阅读lparser.cldo.c或从最初报告此问题的邮件列表中的帖子来实验确定。)

于 2013-09-08T00:36:57.170 回答