语法格式
function_scope function function_name( argument1, argument2, argument3, ...)
function_body
return result_params_comma_separated
end
相关说明
function_scope:函数作用域,全局或者local,不设置默认为全局
function:函数声明
function_name:函数名,可选,如不设置表示匿名函数
argument:函数参数,可选
return result, ...:函数可返回多个值,多个值之间用逗号间隔
如果函数没有返回值,可不带return语句
示例:有名称函数
Lua 5.4.4 Copyright (C) 1994-2022 Lua.org, PUC-Rio
-- 定义函数fun,函数无返回值
> function fun() print('瓜田李下') end
-- 调用函数fun
> fun()
瓜田李下
示例:匿名函数
Lua 5.4.4 Copyright (C) 1994-2022 Lua.org, PUC-Rio
-- 定义匿名函数,将其赋值给fun2
> fun2=function() print('海贼王') end
-- 通过fun2调用匿名函数
> fun2()
海贼王
示例:没有参数
Lua 5.4.4 Copyright (C) 1994-2022 Lua.org, PUC-Rio
-- 函数没有参数
> function fun() print('瓜田李下') end
-- 调用函数
> fun()
瓜田李下
示例:固定个数参数
Lua 5.4.4 Copyright (C) 1994-2022 Lua.org, PUC-Rio
-- 有2个参数
> function fun(a,b) print(a,b) end
-- 调用函数
> fun(1,2)
1 2
示例:变长参数
Lua 5.4.4 Copyright (C) 1994-2022 Lua.org, PUC-Rio
-- 将变长参数参数传给pairs遍历:pairs{...}(注意是大括号)
> function fun(...) for key,value in pairs{...} do print(key,value) end end
-- 调用函数
> fun(1,2,3,4,5,6)
1 1
2 2
3 3
4 4
5 5
6 6
-- 先将变长参数赋值给表t,然后遍历表
> function fun2(...) t={...} for key,value in pairs(t) do print(key,value) end end
-- 这种传参会报错
> fun2(1,2,3,4,5,6,key='瓜田李下',key2='海贼王')
stdin:1: ')' expected near '='
-- 这种传参合法
> fun2(1,2,3,4,5,6,'瓜田李下','海贼王')
1 1
2 2
3 3
4 4
5 5
6 6
7 瓜田李下
8 海贼王
示例:固定参数、变长参数混合传参
Lua 5.4.4 Copyright (C) 1994-2022 Lua.org, PUC-Rio
-- 固定参数、变长参数混合使用
> function fun(a,b,...) t={a,b,...} for key,value in pairs(t) do print(key,value) end end
-- 调用函数
> fun(1,2)
1 1
2 2
select('#', ...):获取变长参数的长度
select(index, ...):返回从index开始向后的参数
示例:输出select(index, ...)返回结果
huli@hudeMacBook-Pro ~ % cat test.lua
function fun(...)
a={...}
print('#a',#a)
print("select('#',a)", select('#',a))
print("select('#',...)", select('#',...))
for i=1, select('#',...) do
print(select(i,...))
end
end
fun(1,2,3,4,5,6)
huli@hudeMacBook-Pro ~ % lua test.lua
#a 6
select('#',a) 1
select('#',...) 6
1 2 3 4 5 6
2 3 4 5 6
3 4 5 6
4 5 6
5 6
6
示例:使用select遍历输出变长参数
huli@hudeMacBook-Pro ~ % cat test2.lua
function fun(...)
print(select('#',...))
for i=1, select('#',...) do
local a= select(i,...) --将第一个返回值赋值给a
print(a)
end
end
fun(1,2,3,4,5,6)
huli@hudeMacBook-Pro ~ % lua test2.lua
6
1
2
3
4
5
6
示例:无返回值
Lua 5.4.4 Copyright (C) 1994-2022 Lua.org, PUC-Rio
-- 函数没有返回结果
> function fun() print('瓜田李下') end
-- 将fun()的结果赋值给a:先执行fun()函数
> a=fun()
瓜田李下
-- 查看a的值:nil
> a
nil
示例:返回单个结果
Lua 5.4.4 Copyright (C) 1994-2022 Lua.org, PUC-Rio
-- 函数返回单个结果
> function fun() return 1 end
-- 调用函数,将结果赋值给a
> a=fun()
-- 查看a的值:1
> a
1
示例:函数返回多个结果
Lua 5.4.4 Copyright (C) 1994-2022 Lua.org, PUC-Rio
-- 函数返回3个结果
> function fun() return 1,2,3 end
-- 调用函数,将函数返回结果依次赋值给a、b、c
> a,b,c=fun()
-- 查看a、b、c的值
> a
1
> b
2
> c
3