一个函数只有一个参数
print "Hello World" <--> print("Hello World")
dofile 'a.lua' <--> dofile('a.lua')
f { x = 10 , y = 20 }
两种操作
o.foo(o,x)
o:foo(x)
舍弃多余的参数
function f(a,b)
return a or b
end
f(3) a = 3 , b =nil
f( 3, 4) a =3, b = 4
f( 3, 4, 5 ) a = 3, b = 4 (5被舍弃)
5.1 多重返回值
Lua会调整一个函数的返回值数量以适应不同的调用情况。若将函数调用作为一条单独语句时,Lua会丢弃函数的所有返回值。若将函数作为表达式的一部分来调用时,Lua只保留函数的第一个返回值。只有当一个函数调用是一系列表达式中的最后一个元素时,才能获得所有返回值。这里先给出三个样例函数,如:
function foo0() end
function foo1() return "a" end
function foo2() return "a","b" end
示例代码 | 结果 | 注释 |
x,y = foo2() | x = "a", y = "b" | 函数调用时最后的(或仅有的)一个表达式,Lua会保留其尽可能多的返回值,用于匹配赋值变量。 |
x = foo2() | x = "a", 返回值"b"被忽略 | |
x,y,z = 10,foo2() | x = 10, y = "a", z = "b" | |
x,y = foo0() | x = nil, y = nil | 如果一个函数没有返回值或者没有足够多的返回值,那么Lua会用nil来填补。 |
x,y = foo1() | x = "a", y = nil | |
x,y,z = foo2() | x = "a", y = "b", z = nil | |
x,y = foo2(),20 | x = "a", y = 20 | 如果一个函数调用不是一系列表达式的最后一个元素,那么将只产生一个值。 |
x,y = foo0(),20,30 | x = nil, y = 20, 30被忽略。 | |
print(foo0()) | 当一个函数调用左右另一个函数调用的最后一个实参时,第一个函数的所有返回值都将作为实参传入第二个函数。 | |
print(foo1()) | a | |
print(foo2()) | a b | |
print(foo2(),1) | a 1 | |
t = {foo0()} | t = {} --空table | table构造器可以完整的接收一个函数调用的所有结果,即不会有任何数量方面的调整。 |
t = {foo1()} | t = {"a"} | |
t = {foo2()} | t = {"a", "b"} | |
t = { foo0(), foo2(), 4} | t[1] = nil, t[2] = "a", t[3] = 4 | 如果函数调用不是作为最后一个元素,那么只返回函数的第一个结果值。 |
print((foo2())) | a | 如果函数调用放入圆括号中,那么Lua将只返回该函数的第一个结果值。 |
5.2 变长参数
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}))
local a,b = ...
遍历所有变长参数
for i =1, select('#', ... ) do ---会返回所有变长参数的总数,其中包括 nil
local arg = select( i, ...)
<循环体>
end
5.3 具名实参