接上文,控制语句下来就是一门语言不可或缺的一部分—函数。
函数
Lua中的函数可以做为First Class(第一类值),即函数可以做为变量赋值给其他变量,可以做为参数传递,还可以做为另一个函数的返回值返回,传递赋值返回之后,函数还可以通过func()的方式继续进行调用使用。
函数形式
function关键字
1
2
3
4
5function LuaFunc(param1, param2)
local val = param1 + param2
-- do something
return val
enda). 函数名称LuaFunc,调用或者传递时使用这个名称,param1,param2形参,val是返回值,不必多说。
b). 可以通过LuaFunc(1, 2)这种方式来调用。也可以local funcReceiver = LuaFunc这样来赋值。当然,
你还可以这样调用,Lua并不会像静态编译语言一样进行参数个数匹配检查。
LuaFunc(19) — 此时param2=nil
LuaFunc(1, 2, 3) — 此时3没有任何作用,被舍弃
也就是,少于形参个数之个的参数默认是nil,多于形参个数的参数默认被行么,这就lua函数的最基本形式。
多个返回值
Lua可以返回多个可以是不同类型的返回值,形式就是在return关键之后按逗号分隔所有需要返回的值即可。
1
2
3function MultipleReturnVal(para1)
return "bugcode", 26, {[2] = "bugcode.net"}, 1.0
end如果MulitipleReturnVal只是单独调用,没有表达式,那所有的返回值都舍弃,如果有构成表达式,那Lua会保留尽可能多的返回值。如:
local x, y, z = MultipleReturnVal(1),Lua会将x,y,z分别赋值为”bugcode”, 26, {[2] = “bugcode.net”},最后一个1.0没有接收的变量即被舍弃
另一种情况如果接收的值多于返回的值,则多余的接收的值被置为nil。以上二个规则也同样适用于某个返回多个值的函数被另一个函数做为参数的情况。
如果想主动舍弃某个返回的变量, 使用下划线来占位即可,如:不想接收第三个是table的参数
local x, y, _, z = MultipleReturnVal(1) — 这样返回值中第三个参数就会初舍弃
变长参数。
函数参数可能是多个不定数量的参数,这时就需要Lua的变长参数。用法非常简单:
1
2
3
4
5
6
7
8
9function VarArgsFunc(mixedParm, ...)
local sum = 0
for k, v in pairs(...) do
if type(v) == "number" then
sum = sum + v
end
end
return sum
end
a). 变参使用三个点(…)来表示,可以把它想成一个table,也可以想成一个多返回值的函数,它可以被传递也可以赋值给别的变量。变参之前也可以有固定参数,传入实参会按顺序将参数赋值给对应的实参然后把其余的都传递给变参。
b). 如上例,VarArgsFunc(1, 2, 3, 4, 5, 6, 7),这样调用会将1赋值给mixedParam,其余都在…中,这样在迭代体中,检测如果是数字类型就对其累加,最后的结果就是7个实参的后6个数之和。
具名参数。
普通的lua函数与其他编程语言的函数一样,函数参数都是函数定义时的函数参数一一对应,包括位置。
1
2
3
4
5
6
7function LocationPara(str, num)
string.format("string = %s", str)
string.format("number = %f", num)
end
LocationPara("bugcode", 3.14)
LocationPram(3.14, "bugcode") -- 会出问题如上例,参数位置不同了,可能就会出现各种问题。但是Lua并不支持类似这种func(first = “1”, second = “2”)语法,但是通过table可以变相的实现这种机制,就是函数只接收一个table类型的参数,然后table里的面的每个key都对应不同的名字,变相的要table里的value做参数值,key就是那个参数的名字。
paramTable = {first = “0”, second = “0”}, 那再进行传参的时候就不必关心位置了,只需要关心table内的对应的key下的value是否赋值就可以了。
1
2
3
4
5
6
7
8local tbl = {second = "222", first = "111", num = 2}
function NamedArgs(nameArgs)
-- 类似这样,无需关心参数顺序,只需要关心参数值与值类型即可
if nameArgs["first"] and type(nameArgs["first"]) == "string" then
-- do something
end
--
end下文继续记录Lua函数相关的深入要点。