Function 为什么使用。。。在函数中的任何表达式中,是否导致Lua中arg的值为零?

Function 为什么使用。。。在函数中的任何表达式中,是否导致Lua中arg的值为零?,function,lua,arguments,variadic-functions,Function,Lua,Arguments,Variadic Functions,为什么在表达式中使用..会导致arg的值变为 benil例如,使用打印(“隐式表的值:,…)或选择(1,…)?Lua 5.1正式反对使用arg表作为varargs,更喜欢…。但是,Lua本身有一个编译时选项,Lua\u COMPAT\u VARARG,允许在5.1代码中使用arg 如果编译LUA时定义了LUA\u COMPAT\u VARARG,则会在varargs函数中创建一个arg表,并填充参数-除非编译器检测到函数内部使用了…。在这种情况下,它假设您使用的是5.1样式的varargs,而不

为什么在表达式中使用
..
会导致
arg
的值变为

be
nil
例如,使用
打印(“隐式表的值:,…)
选择(1,…)

Lua 5.1正式反对使用
arg
表作为varargs,更喜欢
。但是,Lua本身有一个编译时选项,
Lua\u COMPAT\u VARARG
,允许在5.1代码中使用
arg

如果编译LUA时定义了
LUA\u COMPAT\u VARARG
,则会在varargs函数中创建一个
arg
表,并填充参数-除非编译器检测到函数内部使用了
。在这种情况下,它假设您使用的是5.1样式的varargs,而不是5.0,并且不创建表。但是,它仍然会创建名为
arg
的本地文件

这样做的结果是,如果定义了
LUA\u COMPAT\u VARARG
,则在主体中不使用
..
的VARARG函数将获得一个包含参数列表的
local arg
,而获得包含
nil
local arg的VARARG函数。此错误存在于5.1的所有版本中,尤其意味着,如果在编译时定义了
LUA\u COMPAT\u VARARG
,则无法从任何varargs函数访问名为
arg
的全局或upvalue

Lua5.2完全放弃了对
arg
-style varargs的支持,因此无论编译时如何配置,都不会出现此问题


(来源:5.0和5.1之间的varargs处理的变化,以及
LUA\u COMPAT\u VARARG
选项,都在中提到。手册向您介绍。据我所知,确切的行为没有任何地方记录;可以通过阅读和,或者从邮件列表上最初报告这一点的帖子,通过实验确定

好的,这很有趣。我在lua 5.2.0中试用过,得到了以下结果:
表:00899618
作为
参数
值(确认您所说的)。通过“编译时”,您的意思是在编译lua解释器时,还是在使用
luac.exe
编译lua脚本时。如何了解这些细节?@Segfault他指的是当解释器是从源代码构建的,并且类似
-DLUA\u COMPAT\u VARARG
之类的东西提供给C编译器时。
-DLUA\u COMPAT\u ALL
都在makefile中。我猜
\u ALL
意味着
LUA\u COMPAT\u VARARG
包含在内。这是文档中的信息还是什么?segfult它是文档化的-手册和
luaconf.h
中的注释提到了它,行为的确切细节(例如,即使在
..
模式下,它创建名为
arg的本地文件的方式)在我所知的任何地方都没有记录。我已经编辑了这个问题,以包含到相关源的链接。至于
LUA\u COMPAT\u ALL
,这是一个问题,并且在定义时启用所有向后兼容选项。
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)