Lua函数中的可变长参数的处理

一、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

五、参考

PIL-Variable Number of Arguments

StackOverflow-Variable number of function arguments Lua 5.1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值