函数的构建 lua编程语言函数定义格式如下:
1 2 3 4 optional_function_scope function (argument1,argument2,argument3...,argumentn) function_body return result_parames_comma_separated end
【解析】
optional_function_scope: 该参数是否选的制定函数是全局函数还是局部函数,未设置该参数默认为全局函数,如果你需要设置函数为局部函数需要关键字local
function_name: 指定函数名称
argument1,argument2,argument3…argumentn: 函数参数,多个参数以逗号隔开,函数也可以不带参数
function_body: 函数体,函数中需要执行的代码语句块
return_params_comma_separated; 函数返回值,lua语言函数可以返回多个值,每个值以逗号隔开
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 function max (num1,num2) if (num1 > num1) then a = num1 else a = num2 end return a end print ("两值比较最大值为:" ,max (10 ,6 ))print ("两值比较最大值为:" ,max (1 ,6 ))=====结果===== 两值比较最大值为:10 两值比较最大值为:6
1 2 3 4 5 6 7 8 9 10 11 12 13 function foo () print ("true" ) end print (foo)print (foo())=====结果===== function :00000000005DDCA0 true
如果参数列表为空,必须使用()表明是函数调用
如果函数只有一个参数,且为字符串或表结构,()可有可无:print “true”
多返回值 lua函数可以返回多个结果值,在return后列出要返回的值的列表即可返回多值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 function maximum (a) local mi = 1 local m = a[mi] for i,val in ipairs (a) do if val > m then mi = i m = val end end return m,mi end print (maximum({8 ,10 ,11 ,23 ,15 ,5 }))=====结果===== 23 4
lua总是调整函数返回值的个数以适用调用环境,当作为独立的语句调用函数时,所有返回值将被忽略 假设有如下三个函数:
1 2 3 function foo0 () end function foo1 () return 'a' end function foo2 () return 'a' ,'b' end
第一,当作为表达式调用函数时,有以下几种情况:
当调用作为表达式最后一个参数或者仅有一个参数时,根据变量个数函数尽可能多地返回多个值,不足补nil,超出舍去
在其他情况下,函数调用仅返回第一个值(如果没有返回值为nil)
1 2 3 4 5 6 7 8 9 10 11 12 function foo0 () end function foo1 () return 'a' end function foo2 () return 'a' ,'b' end x,y = foo2() x = foo2() x,y,z = 10 ,foo2() x,y = foo0() x,y = foo1() x,y,z = foo2() x,y = foo2(),20 x,y = foo0(),20 ,30
第二,函数调用作为函数参数被调用时,和多值赋值是相同的
1 2 3 4 5 6 7 8 9 function foo0 () end function foo1 () return 'a' end function foo2 () return 'a' ,'b' end print (foo0()) print (foo1()) print (foo2()) print (foo2(),1 ) print (foo2() .. "x" )
第三,函数调用在表构造函数中初始化时,和多值赋值时相同
1 2 3 4 5 6 7 8 function foo0 () end function foo1 () return 'a' end function foo2 () return 'a' ,'b' end a = {foo0()} a = {foo1()} a = {foo2()} a = {foo0(),foo2(),4 }
另外,return f()这种形式,则返回”f()的返回值”:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 function foo (i) if i == 0 then return foo0() elseif i == 1 then reutrn foo1() elseif i == 2 then return foo2() end end print (foo(1 )) print (foo(2 )) print (foo(0 )) print (foo(3 ))
可以使用圆括号强制使调用返回一个值
1 2 3 4 5 6 7 function foo0 () end function foo1 () return 'a' end function foo2 () return 'a' ,'b' end print ((foo0())) print ((foo1())) print ((foo2()))
一个return语句如果使用圆括号将返回值括起来也将导致返回一个值
函数定义 作为表达式调用函数 1 2 3 4 5 6 7 8 9 10 11 local a = f1()local b,c = f1(),f2()local e = f3()print (a,b,c,d,e)=====结果===== nil nil 1 nil 1
解答:当调用作为表达式最后一个参数或者仅有一个参数时,根据变量个数函数尽可能多地返回多个值,不足补nil,超出舍去,其他情况下,函数调用仅返回第一个值(如果没有返回值为nil)
作为函数参数被调用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 print (f1())print (f2())print (f3())print (f1(),f3())print (f1(),f3(),f2())=====结果===== 1 1 2 nil 1 2 nil 1 1
解答:
第一行:无输出,在print也会被忽略输出
第二行:输出结果的第一行对应f2()
第三行:f3()有两个结果,所以输出2个结果
第四行:f1()虽然没有输出,但是在逗号前他是被强制输出的,所以有nil值输出
第五行:有逗号间隔,逗号前都被要求输出一个结果,所以f3()只输出第一个返回值
作为表构造函数的初始值 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 local t1 = {f1()}local t2 = {f2()}local t3 = {f3()}local t4 = {f1(),f2(),f3()}print (#t1)print (#t2)print (#t3)print (#t4)=====结果===== 0 1 2 4
可变参数(三个点表示) lua将函数的参数放在一个叫arg的表中,除了参数以外,arg表还有一个域n表示参数的个数(lua会将前面的实参传给函数的固定参数,后面的实参放在arg表中)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 function average (...) a = 0 local arg = {...} for i,v in ipairs (arg ) do a = a + v end print ("总共传入" ..#arg .."个数" ) return a/#arg end print ("平均值为:" average(10 ,5 ,3 ,4 ,5 ,6 ))=====结果===== 总共传入6 个数 平均值为: 5.5
强制转换 在函数外加上括号()就能实现强制返回一个值
1 2 3 4 5 6 7 8 9 10 11 12 function f () return 1 ,2 ,3 end print (f())print ((f()))=====结果===== 1 2 3 1