lua函数
在lua中函数是对语句和表达式进行抽象的主要方法。既可以用来处理一些特殊的工作,也可以永安里计算一些值。
lua提供了许多内建的函数,可以很方便的在程序中调用他们,如print()函数可以将传入的参数打印在控制台上。
lua函数主要有两个用途:
- 1.完成指定的任务,在这种情况下函数作为调用语句使用。
- 2.计算并返回值,这种情况下函数作为赋值语句的表达式
函数定义
optional_function_scope function function_name(arg1,arg2...)
function_body
return result_params_comma_sepatated
end
- optional_function_scope:该参数是可选的制定函数是全局函数还是局部函数,未设置该参数默认为全局函数,如果需要设置为局部函数需要使用关键字local。
- function_name:指定函数名称。
- arg1,arg2...:函数参数,以逗号分开。也可不带参数。
- function_body:函数体。
- result_params_comma_sepatated:函数返回值。可有多个返回值,以逗号分隔开。
实例
function max(num1, num2)
if(num1 > num2) then
result = num1
else
restule = num2
end
return result
end
print("max = ", max(10,3))
print("max = ", max(1,3))
root@mzs:/home/mzs/lua_study/lua_mzs/hello# lua func.lua
max = 10
max = 10
lua中我们可以将函数作为参数传递给函数:
myprint = function(param)
print("this is print func - ##",param ,"##")
end
function add(num1, num2, functionPrint)
result = num1 + num2
functionPrint(result)
end
myprint(10)
add(2,5,myprint)
root@mzs:/home/mzs/lua_study/lua_mzs/hello# lua func_param.lua
this is print func - ## 10 ##
this is print func - ## 7 ##
多返回值
lua函数返回值可以返回多个结果值,比如string.find,其返回匹配串“开始和结束的下标”(如果不存在匹配串返回nil)
> s, e = string.find("www.baidu.com","baidu")
> print(s, e)
5 9
>
lua函数中,在return后列出要返回值的列表即可,如:
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,19,199,5,0}))
root@mzs:/home/mzs/lua_study/lua_mzs/hello# lua func_moreret.lua
199 3
可变参数
lua函数可以接受可变数目的参数,和c语言类似,在函数参数列表中使用三点 (...)表示函数有可变的参数。
function add(...)
local s = 0
for i, v in ipairs{...} -->{...}表示一个由变长参数构成的数组
do
s = s + v
end
return s
end
print(add(3,4,5,6,7))
root@mzs:/home/mzs/lua_study/lua_mzs/hello# lua func_kebianparam.lua
25
我们可以将可变参数赋值给一个变量
function average(...)
local result = 0
local arg = {...}
for i, v in ipairs(arg) -->{...}表示一个由变长参数构成的数组
do
result = result + v
end
print("total args "..#arg.."个数")
return result/#arg
end
print("average value =",average(10,5,3,3,5,6))
root@mzs:/home/mzs/lua_study/lua_mzs/hello# lua func_kebianparam.lua
total args 6个数
average value = 5.3333333333333
我们也可以通过select("#",...),来获取可变参数的数量:
function average(...)
local result = 0
local arg = {...}
for i, v in ipairs(arg) -->{...}表示一个由变长参数构成的数组
do
result = result + v
end
print("total args "..select("#",...).."个数")
return result/select("#",...)
end
print("average value =",average(10,5,3,3,5,6))
root@mzs:/home/mzs/lua_study/lua_mzs/hello# lua func_kebianparam.lua
total args 6个数
average value = 5.3333333333333
有时候我们可能需要几个固定参数加上可变参数,固定参数必须放在可变长参数之前:
function fwrite(fmt,...) -->固定参数fmt
return io.write(string.format(fmt,...))
end
fwrite("fwrite mzs\n") --> 没有变长参数
fwrite("%d%d\n",1,2) --> fmt = "%d%d" ,变长参数为 1 、2
root@mzs:/home/mzs/lua_study/lua_mzs/hello# lua fun_kebian_bukebian.lua
fwrite mzs
12
通常在遍历变长参数的时候只需要使用{...},然而变长参数可能会包含一些nil,那么就可以用select函数来访问变长参数了:
- select("#",...) 返回可变参数的长度
- select(n,...) 用于访问n 到select("#",...)的参数。
do
function foo(...)
for i=1,select("#",...) do
local arg = select(i, ...)
print("arg = ",arg)
end
end
foo(1,2,3,4)
end
root@mzs:/home/mzs/lua_study/lua_mzs/hello# lua func_bianchang_select.lua
arg = 1
arg = 2
arg = 3
arg = 4