lua 函数的可变参数我觉得是蛮好用的,传入,解包都比较清晰明了
1 遍历可变参数
local function test(...)
local arg = {...}
for k, v in pairs(arg) do
print (k ,' is ', v)
end
end
test(1,2,33, 'ab', var, 'eg', {1,2})
运行结果为:
可以看到k值是整数的索引,没有索引5,因为他是一个nil值,如果用ipairs来遍历,那么只会打印前4组值.
如果我们只关注第n个参数,那么只需调用select(n, ...)
local function test(...)
local v3 = select('3', ...)
print('v3 is ', v3)
local v7 = select(7, ...)
for k, v in ipairs(v7) do
print (k ,' is ', v)
end
end
test(1,2,33, 'ab', var, 'eg', {11,22})
运行结果为:
我们看到select的索引参数既可以为int,也可以为string,如'1'.
顺便说一句,想要知道整个可变参数的长度,除了调用#{...},还可以用下面的
local len= select('#', ...) 等价于#{...}
他包括了可变参数中有nil值的个数,当nil只有一个,切不为最后一个时.即#{1,2,3nil} ===3, #{1,2,3,nil,5} === 5,注意#{1,2,3,nil,4,nil} ===3
另外可变参数只能在参数后面,例如function_name(var1, var2, ...),那么传入参数时,从第三个参数算起为可变参数
有个疑问,select(n, p1,p2,p3,...)和t[n],t为{p1,p2,p3,...}的区别是什么?
select(n,p1,p2,p3,...)其实是返回的[pn,pN]的序列,即
pn, pn+1,... = select(n,p1,p2,p3,...)
select参数也可以是固定的,例如select(n, 1,2,3),可以对表select(n,table.unpack(tab))