Lua函数之一
函数声明:
function foo(arguments) statements end
1、函数调用
调用函数的时候,如果参数列表为空,必须使用()表明是函数调用,例如:
os.date()
当函数只有一个参数并且这个参数是字符串或者table构造器的时候,可以省略函数调用操作符"()",例如:
print "Hello World" dofile "a.lua" f{x=10,y=20}
面向对象方式调用函数的语法,例如:
obj::foo(x) obj.foo(obj, x)
实参和形参结合时,多余部分被忽略,不足补充nil,例如:
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 is discarded
2、多返回值
假设有3个函数:
function foo0() end function foo1() return 'a' end function foo2() return 'a', 'b' end
如果只想接收指定的返回值,可以使用哑元(dummy variable),例如:
_,x = foo2() print(x) -- 'b'
另一种方式是使用select函数:
select(index, ...),返回所有>=index的参数;当index='#',返回参数个数
function foo3() return 'a', 'b', 'c' end print(select(1, foo3())) -- a b c print(select(2, foo3())) -- a b print(select(3, foo3())) -- a print(select('#', foo3())) -- 3
在表达式中调用函数时:
1、当函数调用作为表达式最后一个参数(或仅有一个参数)时,函数尽可能多地返回多个值,不足补nil,超出舍去;
2、其他情况下,函数调用仅返回第一个值(如果没有返回值为nil);
x,y=foo2() -- x='a',y='b' x=foo2() -- x='a', 'b' is discarded x,y,z=10,foo2() -- x='10',y='a',z='b' x,y=foo0() --x=nil,y=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 is discarded x,y,z=foo0(),foo2() -- x=nil,y='a',z='b'
函数调用在table构造器中使用时:
a = {foo0()} -- a={}, a is empty a = {foo2()} -- a={a,b} a = {foo0(),foo1(),foo2(),4} -- a={nil,a,a,b,4}
函数调用作为函数参数被使用时:
print (foo0()) -- print (foo1()) -- a print (foo2()) -- a b print (foo2() .. 'x') -- ax
可以使用圆括号"()"强制使调用只返回一个值:
print ((foo0())) -- nil print ((foo1())) -- a print ((foo2())) -- a
unpack 函数接受一个数组作为输入参数,并返回数组的所有元素。
a={"england",960,"china",30, x="america"} print(unpack(a)) -- england 960 china 30
上面的print函数可以打印可变参数。
2、可变参数
在Lua中,使用 ... 表示可变参数,在函数中可变参数会存放在arg的一个table中,它有一个域n表示参数个数。
function g(a,b,...) result = "" for i,v in ipairs(arg) do result = result .. tostring(v) .. '\t' end result = result .. '\n' end g(3) -- a=3, b=nil, arg={n=0} g(3,4) -- a=3, b=4, arg={n=0} g(3,4,5,8) -- a=3, b=4, arg={5,8,n=2}
如上面所示,Lua会将前面的实参传给固定参数,后面的实参放在arg表中。