<h3 id="目录">目录</h3>
  1. 函数
  2. 多个返回值
  3. 可变长函数参数

函数

在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会根据被调用情况调整返回值的个数。

  1. 当函数被作为一条单独语句调用的时候,其所有的返回值都将被舍弃。
  2. 当函数被作为表达式调用时,将只保留第一个返回值。
  3. 当函数调用时一系列表达式中的最后一个表达式时,其所有的返回值才能被获取到。
  4. 当函数调用是另一个函数调用的最后一个表达式时能返回多个值,否则只能返回一个值。
  5. 将函数调用用一对圆括号括起来可以强制其只返回一个结果。

可变长函数参数

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;">