lua函数
调用函数的时候,如果参数列表为空,必须使用()表明是函数调用。例外:当函数只有一个参数并且这个参数是字符串或者表构造的时候,()可有可无。
print "hello world" f{x=10,y=20}等价于f({x=10,y=20})
Lua函数实参和形参的匹配与赋值语句类似,多余部分被忽略,缺少部分用nil补足
1.当调用作为表达式最后一个参数或者仅有一个参数时,根据变量个数函数尽可能多地返回多个值,不足补nil,超出舍去
2.其他情况下,函数调用仅返回第一个值(如果没有返回值为nil)
function foo0()end function foo1()return 'a' end function foo2()return 'a','b' end x,y=foo2()--x='a',y='b' x,y=foo2(),20--x='a',y=20 print(foo2())--输出a,b print(foo2(),1)--输出a,1 a={foo2()}--a={'a','b'} a={foo2(),4}--a={'a',4} function foo(i) if i==0 then return foo0() elseif i==1 then return foo1() elseif i==2 then return foo2()--若是return (foo2())则返回a end end print(foo(2))--输出a,b,若是print((foo(2)))则返回a,即使用圆括号强制使调用返回一个值
unpack函数接受一个数组作为输入参数,返回数组的所有元素,用来实现参数可变的函数
f=string.find a={"hello","ll"} print(f(unpack(a)))
可变参数
lua函数可以接受可变数目的参数,在函数参数列表中使用...表示函数有可变的参数.Lua将函数的参数放在一个叫arg的表中,除了参数以外,arg表中还有一个域n表示参数的个数.
result="" function myprint(...) for i,v in ipairs(arg) do result=result..tostring(v)..'\t' end result=result..'\n' end myprint("liujianyu","io") print(result)
忽略函数的某个返回值,可以使用哑元(下划线)
local _,x=string.find("liujianyu","jian") --now use x
将函数的可变参数传递给另外的函数调用,可以使用unpack(arg)返回arg表所有的可变参数.
function fwrite(fmt,...) return io.write(string.format(fmt,unpack(arg))) end print(fwrite("current=%s","sdfsfe"))
Lua中的函数是带有词法定界的第一类值。第一类值指:在Lua中函数和其他值(数值、字符串)一样,函数可以被存放在变量中,也可以存放在表中,可以作为函数的参数,还可以作为函数的返回值.
词法定界指:嵌套的函数可以访问它外部函数中的变量.
network={ {name="grauna",IP="210.26.30.34"}, {name="arraial",IP="210.26.30.23"}, {name="lua",IP="210.26.23.12"}, {name="derain",IP="210.26.23.20"} } table.sort(network,function(a,b) return (a.name>b.name) end)
闭包:
--匿名函数中i是外部的局部变量,称为upvalue function newCounter() local i=0 return function() i=i+1 return i end end c1=newCounter() print(c1())--1 print(c1())--2
函数作为table的域的定义方法:
--1 lib={} lib.foo=function()return end --2 lib={foo=function()return end} --3 function lib.foo() return end
局部函数:
local fact--其实没必要有这行 --递归使用局部函数需要先声明,再定义 fact = function (n) if n==0 then return 1 else return n*fact(n-1) end end print(fact(3))
尾调用类似在函数结尾的goto调用,当函数最后一个动作是调用另外一个函数时,称这种调用为尾调用。
function f(x) return g(x) end
Lua尾调用之后程序不需要在栈中保留关于调用者的任何信息,所以是支持正确的尾调用