Lua 学习 chapter6
<h3 id="目录">目录</h3>
- 函数
- 多个返回值
- 可变长函数参数
函数
在lua中,函数是对语句和表达式抽象的主要方式。函数的调用需要一对空括号,里面放着参数。唯一的例外就是当参数只有一个且该参数是字符串或表构造器。
1
2
3
4
5
6
print [[a multi-line
message]]
--[[>print([[a multi-line
message]])]]
f{x=10,y=3} –>f({x=10,y=3})
lua函数是存在语法糖的,即使用冒号来调用函数会把第一个参数默认认为是调用对象本身
1
o:f(x) -->其中x就是o对象
在lua进程中调用Lua语言编写的函数和用c编写的函数方式是一样的,没有任何区别。
在lua中,调用函数使用的参数个数可以和定义函数使用的参数个数不一致,当传入参数的个数大于定义的时候后面没有用到的参数就会被舍弃,当传入的参数个数少的时候,后面的参数就会被默认为nil。
多个返回值
在lua函数中,它允许一个函数返回多个返回值。 函数定义返回多个返回值,但是在调用的时候lua会根据被调用情况调整返回值的个数。
- 当函数被作为一条单独语句调用的时候,其所有的返回值都将被舍弃。
- 当函数被作为表达式调用时,将只保留第一个返回值。
- 当函数调用时一系列表达式中的最后一个表达式时,其所有的返回值才能被获取到。
- 当函数调用是另一个函数调用的最后一个表达式时能返回多个值,否则只能返回一个值。
- 将函数调用用一对圆括号括起来可以强制其只返回一个结果。
可变长函数参数
lua语言中的函数是可边长函数参数,参数列表中的三个点表示该函数是可变长的。 当函数访问这个可变长参数的时候可以将其视作一个表达式。它的放回结果就是各个参数,当然要对其访问的时候,也可以通过表构造器来访问。
1
2
3
4
5
6
7
8
9
10
function add(...)
local s = 0
for _,v in ipairs {...} do
s = s + v
end
local a,b = ...
return s
end
函数也可以由固定参数加可变参数,但是可变参数一定要在固定参数的后面。
在上面的例子中,直接使用表构造器还是存在问题的,如果中间存在nil表就不是连续的了,对于这种情况跟lua提供了函数table.pack, 该函数像{…}保存所有的参数,然后将其放在一个表中范慧慧,但是这个表还有一个保存了参数个数的额外字段 n 。
1
2
3
4
5
6
7
8
function nonils(...)
local arg = table.pack(...)
for i = 1, arg.n do
if arg[i] == nil then return false
end
return true
end
可以使用上面的方法来判断参数是否存在空。
在lua中还有一个函数select,函数select总是存在一个固定参数selector和数量可变的参数,如果selector是数值n,则select函数返回n(包含n)之后的所有参数。否则selector应该是字符串”#”,select返回额外参数的总数。
1
2
3
print(select(1,"a","b","c")) -->a b c
print(select(2,"a","b","c")) -->b c
print(select("#","a","b","c")) -->3
与pack相对应,table.unpack的参数是一个数组,返回值为数组内的所有元素。 顾名思义,pack将参数列表转换成一张表,而unpack将表转换成一组返回值。 如果有需要也可以显示的限制返回值的范围:
1
print(table.unpack({"M","T","Tu","W"},2,3)) --> T Tu
<hr style="visibility: hidden;">