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

本文详细介绍了Lua语言中如何处理不定数量的实参,即变长参数。文章解释了通过3点(...)符号来定义和访问变长参数的方法,并对比了Lua5.0中的不同实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

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

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

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

    (1)ipairs方式遍历

 


    (2)pairs方式遍历



    (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




### Lua可变参数的使用方法及其实现 在 Lua 编程语言中,支持函数接收不定数量的参数,这种特性被称为 **可变参数** 或者 **变长参数**。以下是关于 Lua 可变参数的具体用法及其实现方式。 #### 1. 声明带有可变参数函数 当定义一个可以接受任意数量参数函数时,在形参列表最后加上三个点 `...` 即可表示这些额外的参数[^1]。例如: ```lua function myFunction(arg1, ...) -- 函数体 end ``` 在这个例子中,除了第一个固定参数 `arg1` 外,其余传入的参数会被视为可变参数处理。 #### 2. 访问可变参数的方式 访问可变参数有两种常见方法:一种是通过 `{...}` 将其转换成表;另一种则是利用内置函数 `select` 来获取特定位置上的值或者统计总共有多少个参数被传递进来[^2]。 ##### (a) 使用表格形式存储所有额外输入项 可以通过创建一个新的数组型表来保存所有的附加参数: ```lua local extraArgs = {...} print(extraArgs[1], extraArgs[2]) -- 输出前两个额外参数 ``` 注意这里得到的是原始数据类型的副本而不是引用关系[^4]。 ##### (b) 利用 select() 获取具体信息 `select()` 是专门用于操作多返回值的一个工具,它能够帮助我们提取指定索引处的实际数值或者是计算出一共接收到几个这样的项目数: ```lua -- 统计实际传入了多少个参数 print(select("#", ...)) -- 提取第三个参数的内容 print(select(3, ...)) ``` 如果是在较旧版本比如 Lua 5.0 当中的情况,则会自动存在一个叫做 `arg` 的隐藏局部变量以及它的成员属性 `.n` 表达相同含义。 #### 3. 实际应用案例展示 下面给出一段完整的演示代码片段,综合展示了上述知识点的应用场景: ```lua function sum(...) local nums = {...} -- 转化为 table 类型 local total = 0 for i=1,#nums do -- 遍历整个集合求和 total = total + tonumber(nums[i]) end return total -- 返回最终结果 end print(sum(1,2,3,"4")) -- 测试运行效果 -> 应该打印 '10' ``` 以上程序实现了简单的累加功能,并允许用户一次性提交多个待相加的数据对象给定目标函数调用。 --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值