一、Lua函数中的可变长参数
Lua允许接收一系列的可变长参数,如同C#的params;但是,我们如何去获取这些可变长参数呢;
arg,当函数被调用时,所有的参数都会被收集到一个名为arg的序列表中,我们可以使用arg[1]等来获取参数;一个比较特殊的字段是n,arg.n被用来获取表的长度,也就是参数的数量;
但是在lua5.1以后,不再使用这种处理方式,它不会再为每一个可变长参数生成一个table;如果我们还想要使用arg,我们最好使用如下写法
function func(...)
local arg={...}
end
或者使用select来代替,但是select的使用场景和上一种方法稍有差异,select的使用将在下面多返回值中讲述
二、多返回值
select用的最多的两个地方,一个是可变长参数,一个是多返回值;
local _, x = string.find(s, p)
如上代码,我们获取了多个返回值,但是只需要用到第二个返回值,这是我们使用占位符也就是dummy variable来处理;一种更简单的处理方式就是使用select,print(select(1, string.find("hello hello", " hel"))) --> 6
select:官方解释如下
- If index is a number, returns all arguments after argument number index.
- Otherwise, index must be the string "#", and select returns the total number of extra arguments it received.
在可变长参数列表中的应用;
function g (...)
print(select(1,...))
print(select("#",...))
end
g(2,3,5) --2,3
三、如何传递可变长参数
上面讲述了如何读取函数中传入的可变长参数,现在讲述一下如何将一个表传递给一个函数作为一个可变长参数,这就需要使用unpack(),它会返回arg中所有的值;还可以添加第二个参数n,返回n之后所有的值;
注意:在lua5.2以后,需要使用unpack=table.unpack()来替代;
function g(...)
end
function f(...)
local arg={...}
g(unpack(ard))
end
四、问题收集
1.cannot use '...' outside a vararg function near '...'
local functor= function(cb)
cb()
end
local OnComplete = function(cb, ...)
functor(function()
cb(...)
end)
end
如上代码会引发该语法错误,不可以在一个可变长参数函数的外部使用...,因为...是匿名的,且lua5.1以后不再为vararg自动创建一个表,所以我们需要手动建表;
local functor= function(cb)
cb()
end
local OnComplete = function(cb, ...)
local arg = {...}
functor(function()
cb(unpack(arg))
end)
end