09,Lua 函数_01(可变参数)

     Lua中的函数可以接受不定数量的实参,对于不定数量的实参,可以通过传入3点(...)的方式进行参数匹配;

当函数参数列表中传入3点(...)时,则表示该函数有可变的参数。当传入"可变参数"函数被调用时它的所有参数都会被收集到一起,这部分收集起来的实参称为这个函数的"变长实参"。

    一个函数要访问它的变长参数时,仍需要用到3点(...)。但不同的是,此时这3个点是作为一个表达式来使用的。譬如:

   1,表达式"...":类似于一个具有多重返回值的函数,它返回的是当前函数的所有变长参数。

local a, b = ...
--这里用第一个和第二个变长参数的数值来初始化a,b这两个局部变量。

      2,表达式{...}:表示由所有变长参数构成的数组table,在遍历变长参数时可使用这种表达式的方式,就像访问table一样,访问所有的变长函数。

    注意:然而在某些特殊情况下,变长参数可能会包含一些故意传入的nil值,此时就需要用函数select来访问变长参数了。示例:

    (1)ipairs方式遍历

 09,Lua 函数_01(可变参数)_第1张图片

09,Lua 函数_01(可变参数)_第2张图片

    (2)pairs方式遍历

09,Lua 函数_01(可变参数)_第3张图片

09,Lua 函数_01(可变参数)_第4张图片

    (3)select方式

09,Lua 函数_01(可变参数)_第5张图片

09,Lua 函数_01(可变参数)_第6张图片

调用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




你可能感兴趣的:(Lua程序设计)