版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ArisKing/article/details/80188816
Lua中的函数可以接受不定数量的实参,对于不定数量的实参,可以通过传入3点(...)的方式进行参数匹配;
当函数参数列表中传入3点(...)时,则表示该函数有可变的参数。当传入"可变参数"函数被调用时它的所有参数都会被收集到一起,这部分收集起来的实参称为这个函数的"变长实参"。
一个函数要访问它的变长参数时,仍需要用到3点(...)。但不同的是,此时这3个点是作为一个表达式来使用的。譬如:
1,表达式"...":类似于一个具有多重返回值的函数,它返回的是当前函数的所有变长参数。
local a, b = ...
--这里用第一个和第二个变长参数的数值来初始化a,b这两个局部变量。
2,表达式{...}:表示由所有变长参数构成的数组table,在遍历变长参数时可使用这种表达式的方式,就像访问table一样,访问所有的变长函数。
注意:然而在某些特殊情况下,变长参数可能会包含一些故意传入的nil值,此时就需要用函数select来访问变长参数了。示例:
(1)ipairs方式遍历
(2)pairs方式遍历
扫描二维码关注公众号,回复:
3310117 查看本文章
(3)select方式
调用select时,必须传入一个固定的实参selector(选择哪个位置的参数进行访问)和变长参数本身。如果selector为数字n,那么select返回它的第n个可变实参。否则,selector只能为字符串"#",这样select会返回变长参数的总数(包括nil值)。
Lua 5.0对于变长参数则有另外一套机制。声明函数的语法是一样的,也是将3个点作为最后一个参数。但是Lua5.0没有提供"..."表达式。而是通过一个隐含的局部table变量"arg"来接受所有的变长参数。这个table还有一个名为"n"的字段,用来记录变长参数的总数。大致行为如下:
function foo(a, b, ...)
local arg = {...}
arg.n = select("#", ...)
<函数体>
end