Lua中为何函数内任何表达式使用…会令arg参数变为nil?
- 内容介绍
- 文章标签
- 相关推荐
本文共计584个文字,预计阅读时间需要3分钟。
函数`tell(num, ...)`用于打印隐式表中的值。以下是对给定内容的简化
plaintext函数 tell(num, ...) 打印隐式表中的值:-- print(value of implicit table: , arg)select(1, arg)-- select(1, ...)endtell(12, 43, 12, 55)
为什么在表达式中使用`...`会导致`arg`的值没有,例如`with print(包含表的内容)`:
在SQL表达式中,使用`...`通常表示参数化的方式,用于传递多个参数。如果`arg`后面直接跟有`...`,而没有明确指定每个参数的值,那么`arg`的值将不会被具体化,导致其值未定义。这是因为`...`指示后续参数是连续的,但没有提供具体的参数值,所以`arg`无法确定其具体内容。
例如,`with print(包含表的内容)`中的`print`函数没有参数,因此`arg`的值是未定义的。要正确使用,应该为每个参数提供具体的值,如`with print(包含表的内容, '表名')`。
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的值
没有,例如with print(“隐含表的值:”,…)或select(1,…)?
如果在编译Lua时定义了LUA_COMPAT_VARARG,则会在varargs函数中创建一个arg表,并使用参数填充 – 除非编译器在函数内部检测到…的使用.在这种情况下,它假定您使用5.1样式varargs而不是5.0,并且不创建表.但是,它确实仍然创建了本地命名的arg!
这样做的结果是,如果定义了LUA_COMPAT_VARARG,那么在体内不使用…的vararg函数将获得包含参数列表的本地arg,以及获取包含nil的本地arg的vararg函数.此错误存在于5.1的所有版本中,尤其意味着如果在编译时定义了LUA_COMPAT_VARARG,则无法从任何varargs函数访问名为arg的全局或高值.
Lua 5.2完全支持arg-style varargs,因此无论在编译时如何配置它都没有这个问题.
(来源:5.0和5.1之间的varargs处理和LUA_COMPAT_VARARG选项的变化在the Lua 5.1 reference manual, section 7.1中提到.手册将您引用到luaconf.h.据我所知,确切的行为没有记录在任何地方;它可以是通过阅读lparser.c和ldo.c,或者最初报告此问题的邮件列表上的帖子,通过实验确定.)
本文共计584个文字,预计阅读时间需要3分钟。
函数`tell(num, ...)`用于打印隐式表中的值。以下是对给定内容的简化
plaintext函数 tell(num, ...) 打印隐式表中的值:-- print(value of implicit table: , arg)select(1, arg)-- select(1, ...)endtell(12, 43, 12, 55)
为什么在表达式中使用`...`会导致`arg`的值没有,例如`with print(包含表的内容)`:
在SQL表达式中,使用`...`通常表示参数化的方式,用于传递多个参数。如果`arg`后面直接跟有`...`,而没有明确指定每个参数的值,那么`arg`的值将不会被具体化,导致其值未定义。这是因为`...`指示后续参数是连续的,但没有提供具体的参数值,所以`arg`无法确定其具体内容。
例如,`with print(包含表的内容)`中的`print`函数没有参数,因此`arg`的值是未定义的。要正确使用,应该为每个参数提供具体的值,如`with print(包含表的内容, '表名')`。
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的值
没有,例如with print(“隐含表的值:”,…)或select(1,…)?
如果在编译Lua时定义了LUA_COMPAT_VARARG,则会在varargs函数中创建一个arg表,并使用参数填充 – 除非编译器在函数内部检测到…的使用.在这种情况下,它假定您使用5.1样式varargs而不是5.0,并且不创建表.但是,它确实仍然创建了本地命名的arg!
这样做的结果是,如果定义了LUA_COMPAT_VARARG,那么在体内不使用…的vararg函数将获得包含参数列表的本地arg,以及获取包含nil的本地arg的vararg函数.此错误存在于5.1的所有版本中,尤其意味着如果在编译时定义了LUA_COMPAT_VARARG,则无法从任何varargs函数访问名为arg的全局或高值.
Lua 5.2完全支持arg-style varargs,因此无论在编译时如何配置它都没有这个问题.
(来源:5.0和5.1之间的varargs处理和LUA_COMPAT_VARARG选项的变化在the Lua 5.1 reference manual, section 7.1中提到.手册将您引用到luaconf.h.据我所知,确切的行为没有记录在任何地方;它可以是通过阅读lparser.c和ldo.c,或者最初报告此问题的邮件列表上的帖子,通过实验确定.)

