函数:
函数有两种用途:1.完成指定的任务,这种情况下函数作为调用语句使用;2.计算并返回值,这种情况下函数作为赋值语句的表达式使用。
语法:
function func_name (arguments-list)
statements-list ;
end ;
调用函数的时候,如果参数列表为空,必须使用()表明是函数调用。
但是,这个规则有一个例外,当函数只有一个参数并且这个参数是字符串或者表构造的时候,()是可选的。
Lua也提供了面向对象方式调用函数的语法,比如:o:foo(x)与o.foo(x)是等价的。
Lua使用的函数可以使Lua编写的也可以使其他语言编写,对于Lua程序员来说用什么语言实现的函数使用起来都一样。
Lua函数实参和形参的匹配与赋值语句类似,多余部分被忽略,缺少部分用nil补足
返回多个结果值
Lua函数可以返回多个结果值,比如string.find,其返回匹配串“开始和结束的下标,如果不存在匹配串则返回nil”
s,e = string.find("hello lua users","lua") ;
print(s,e)
在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,10,23,12,5}))
Lua总是调整函数返回值的个数去适应调用环境,当做为一个语句调用函数时,所有返回值被忽略。
当做为表达式调用的时候,有以下几种情况:
1.当调用作为表达式最后一个参数或者仅有一个参数时,根据变量个数尽可能多的返回多个值,不足补nil,超出舍去。
2.其他情况,函数调用仅返回一个值(如果没有返回值为nil)
函数调用作为函数参数被调用的时候和多值赋值是相同的。
函数调用在表构造函数中初始化,和多值赋值时相同。
另外,return f() 这种类型的返回 f()返回的所有值
可以使用圆括号强制使调用返回一个值
一个return语句如果使用圆括号括起来也将导致返回一个值。
function foo0 () end
function foo1() return 1 end
function foo2() return 2,3 end
x,y = foo2()
print(x,y)
x,y = nil ,nil
x = foo2()
print(x,y)
x,y,z = nil,nil,nil
x,y,z = 10,foo2()
print(x,y,z)
x,y,z = nil
x,y = foo0()
print(x,y)
x,y,z = nil
x,y = foo1()
print(x,y)
x,y,z = nil
x,y,z = foo2()
print(x,y,z)
x,y,z = nil
x,y,z = 20,foo2()
print(x,y,z)
x,y,z = nil
x,y = foo0(),20,30
print(x,y)
print(foo0())
print(foo1())
print(foo2())
print(foo2(),1)
print(foo2() .. "x")
a = {foo0()}
a = {foo1()}
a = {foo2()}
a = {foo0(),foo2(),2}
function foo(i)
if i == 0 then return foo0()
elseif i == 1 then return foo1()
elseif i == 2 then return foo2()
end
end
print(foo(1))
print(foo(2))
print(foo(0))
print(foo(3))
print((foo(0)))
print((foo(1)))
print((foo(2)))