为什么在函数中任何表达式中使用...都会导致Lua中arg的值为nil?

为什么在表达式中使用...会使arg的值为nil,例如print(“隐式表的值:”,...)select(1,...)

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)
点赞
用户2755919
用户2755919

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

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

因此,如果定义了 LUA_COMPAT_VARARG,则在函数体中不使用 ... 的可变参数函数将得到一个包含参数列表的局部变量 arg,而使用 ... 的可变参数函数将得到一个包含 nil 的局部变量 arg。这个错误存在于所有的 5.1 版本中,特别是如果编译时定义了 LUA_COMPAT_VARARG,则无法从任何可变参数函数中访问名为 arg 的全局变量或上值。

Lua 5.2 完全停用 arg -样式的可变参数,因此无论如何在编译时配置,都不会出现此问题。

(来源:5.0 和 5.1 之间的可变参数处理变化和 LUA_COMPAT_VARARG 选项在 Lua 5.1 参考手册 7.1 节 中提到。该手册指向 luaconf.h。就我所知,没有任何地方记录其确切行为;可以通过实验性研究来确定,或从最初报告该问题的邮件列表中阅读 lparser.cldo.c 的帖子来了解其行为。)

2013-09-08 00:36:57