`

Lua程序设计 变长参数

 
阅读更多

Lua中的函数还可以接受不同数量的实参。例如:在调用print时可以传入一个、两个或多个实参。

function add(...)
local s = 0
  for i, v in ipairs{...} do   --> {...} 表示一个由所有变长参数构成的数组
    s = s + v
  end
  return s
end
print(add(3,4,5,6,7))  --->25

--还可以用下面的方式,获取变长参数的数据
local argf = ...
local x, y, z = unpack(argf)

 

参数中的三个点(...)表示该函数可接受不同数量的实参。当这个函数被调用时,它的所有参数都会被收集到一起,这部分收集起来的实参称为这个函数的“变长参数”。

         一个函数要访问他的变长参数时,仍需要用到3个点(...),只是此时的3个点作为一个表达式来使用的(如上)。表达式“...”的行为类似于一个具有多重返回值的函数,它返回的是当前函数的所有变长参数。

 

function fwrite(fmt, ...)  --->3点之前有个固定的参数fmt。具有变长参数的函数同样也可以用拥有任意数量的固定参数,但是固定参数必须放在变长参数之前。
                                lua会将前面的实参赋予固定参数,而将余下的实参(如果有的话)视为变长参数。
 return io.write(string.format(fmt, ...))   
end 

fwrite()  --->fmt = nil,没有变长参数。
fwrite("a")   --->fmt = "a",没有变长参数。
fwrite("%d%d", 4, 5) ---->fmt = "%d%d",变长参数= 4 和 5

 

通常一个函数在遍历其变长参数时只需要使用表达式{...},这就像访问一个table一样,访问所有的变长参数。

       函数select用于访问变长函数中有nil值的情况:

       调用select时,必须传入一个固定的实参selector和一系列变长参数。如果selector为数字n,那么select返回它的第n个可变实参;否则selector只能为字符串“#”,这样select会返回变长参数的总数。

 

for i =1 ,select("#", ...) do
  local arg = select(i, ...)  --->得到第i个变长参数对应的可变实参。
    <循环体>
end

 

分享到:
评论

相关推荐

    Programming_in_Lua,_4th_ed._(2017)_.pdf

    支持可变参数和尾调用优化。 ### 高级特性 - **闭包(Closures)**:函数可以访问外部函数的局部变量,这在Lua中称为闭包。 - **模式匹配(Pattern Matching)**:Lua通过模式匹配进行字符串处理,提供了强大的...

    Lua分享的知识图谱

    - Lua支持变长参数列表,使得函数的参数可以灵活变化。 - Lua的闭包(Closure)支持外部变量的捕获,称为upvalues。一个闭包可以访问定义它的外部函数中的局部变量,这些变量称为upvalues。但upvalues的数量存在上限...

    Lua学习资料PDF

    函数定义使用function关键字,支持默认参数和变长参数。 5. **闭包**:Lua支持闭包,即函数可以访问并修改在其外部定义的变量,即使该函数已经返回。 6. **元表和元方法**:元表是Lua中实现元编程的关键,它允许...

    Programming in Lua, 3rd Edition Lua编程第三版

    读者可以了解到Lua语言的特性,如动态类型系统、自动内存管理、面向过程和面向对象的程序设计能力。 接下来,书中对Lua的类型和值进行了深入的讲解,包括nil类型、布尔类型、数字类型、字符串类型、表类型(Tables...

    getopt.lua:Lua 5.1 及更高版本的简单但强大的参数解析器

    `getopt.lua` 是一个专为 Lua 5.1 及更高版本设计的参数解析库,它使得在 Lua 脚本中处理命令行参数变得简单而高效。这个库是基于 `getopt` 这个概念,`getopt` 在许多编程语言中都有实现,用于解析命令行选项和参数...

    Lua__5__参考手册

    字符串中连续的三个点 `...` 用于表示变长参数。Lua 还支持表(table)这一灵活的数据结构,可以用于实现数组、字典等多种数据类型。 此外,手册还涵盖了变量(local 和 global)、控制流(条件语句、循环语句)、...

    Programming in Lua third edition

    书中讲解了函数的创建、如何处理多返回值、变长参数函数和命名参数的使用。此外,还深入探讨了闭包、非全局函数和适当的尾调用优化等高级主题。 6. **迭代器和通用for**:迭代器是Lua中处理集合数据的强大工具。书...

    高清Programming_in_lua

    7. **C语言接口**:Lua提供了与C语言交互的API,允许在Lua脚本中调用C函数,或者在C程序中调用Lua脚本,从而实现混合编程。 8. **线程与协程**:Lua不支持多线程,但它提供了轻量级的协程(coroutine)机制,可以在...

    Lua 5_1 参考手册

    - **参数和返回值**:支持默认参数和变长参数。 - **闭包**:函数可以访问并修改其词法作用域内的变量。 - **模块(module)**:通过模块系统组织代码,提供命名空间和封装。 ### 5. 表和元表 - **表创建与访问**...

    Lua_5.2_参考

    - **Lua**:一种轻量级、高效的脚本语言,设计初衷是为了嵌入其他应用程序。 - **版本**:5.2 版本是 Lua 的一个重大更新,引入了许多新特性并改进了性能。 #### 2. 基本概念 - **2.1 值与类型** - Lua 支持多种...

    programming in lua 3th pdf

    5. **函数**:深入探讨函数的多返回值、可变参数、命名参数,并对闭包、非全局函数以及适当的尾调用进行了讨论。 6. **迭代器和泛型for**:讲述了迭代器和闭包的使用,通用for循环的语义,无状态迭代器和带有复杂...

    lua-compat-5.3:兼容性模块,为Lua 5.2和5.1提供Lua-5.3风格的API

    5. **表的改进**:引入了`pairs`和`ipairs`的新实现,更有效地处理哈希部分和顺序部分,同时也引入了`table.pack`和`table.unpack`来操作变长参数列表。 6. **元方法的改变**:`__add`, `__sub`, `__mul`, `__div`, ...

    Programming in LUA

    - **可变参数**:Lua函数可以通过省略最后一个参数的形式接受任意数量的参数。 - **命名参数**:通过关键字参数的形式为函数提供参数。 ##### 错误处理 (Errors) - **错误消息**:当程序中出现错误时,Lua会生成...

    effil:对Lua的多线程支持

    - 首先,在C++中定义一个线程函数,该函数接受一个lua_State*指针作为参数,这个指针代表Lua环境。 - 然后,使用effil提供的接口,将这个函数注册到Lua中。 - 在Lua脚本中,可以调用注册的函数来创建和启动新线程...

Global site tag (gtag.js) - Google Analytics