Lua 学习 chapter6

chapter6

Posted by Jow on May 6, 2019

目录

  1. 函数
  2. 多个返回值
  3. 可变长函数参数

Everytime, could fit yourslef later. Let my life live with aim.

函数

在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