1.函数定义的格式:
Lua使用function定义函数,语法如下:
function function_name (arc) --arc表示参数列表,函数的参数列表可以为空
--body
end
上面的语法等价于:
function_name function_name (arc)
--body
end_
上面的方法都是定义了一个全局函数,为了不污染命名空间,同时减少性能损耗,我们应该尽量使用“局部函数”,方法如下(只需要再前面加local声明即可):
local function function_name (arc) --arc表示参数列表,函数的参数列表可以为空
--body
end
注意:Lua函数的本质是变量赋值,所以再使用函数之前,一定要先定义函数(C语言可以再后面定义,前面声明,但是Lua没有声明,只有定义)
由于函数定义等价于变量赋值,也就可以把函数名替换为Lua某个表的字段,如:
function Foo.bar(a, b, c) --此时不能再加local函数声明了
end
2.函数参数
1)Lua函数的参数大部分是按值传递的。
函数传参的几个规则:
a、若参数个数大于形参个数,从左向右,多余的实参被忽略
b、若实参个数小于形参个数,从左向右,没有被初始化的形参被初始化为nil
c、Lua还支持变长参数。用...表示。此时访问参数也要用...,如:
local function func(...) --形参为 ... ,表示函数采用变长参数
local temp = {...} --访问的时候也要使用 ...
local ans = table.concat(temp, "") --使用table.concat库函数,对数组内容使用" "拼接成字符串。
print(ans)
end
func(1, 2) --传递了两个参数
func(1, 2, 3, 4) --传递了四个参数
-->output
1 2
1 2 3 4
2)当函数参数是table类型时,传递进来的实际上是实际参数的引用。如具名函数
3.函数的返回值
Lua函数允许返回多个值,返回多个值时,中间用逗号隔开
函数返回值的规则:
1)若返回值个数大于接收变量的个数,多余的返回值会被忽略掉;
2)若返回值个数小于参数个数,从左向右,没有被返回值初始化的变量会被初始化为nil
函数返回值与表达式:
1)当一个函数返回一个以上的返回值,且函数调用不是一个列表表达式的最后一个元素,那么函数只返回第一个返回值,如:
local function init() --init函数返回两个值 1和"lua"
return 1, "lua"
end
local x, y, z = init(), 2 --init函数的位置不在最后,此时只返回 1
print(x, y, z) -->output 1 2 nil
local a, b, c = 2, init() --init函数的位置在最后,此时返回 1 和 "lua"
print(a, b, c) -->output 2 1 lua
2)如果你确保只取函数返回值的第一个值,可以使用括号运算符,例如:
local function init()
return 1, "lua"
end
print((init()), 2) -->output 1 2
print(2, (init())) -->output 2 1