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尾调用之后程序不需要在栈中保留关于调用者的任何信息,所以是支持正确的尾调用

 

posted @ 2015-04-28 11:05  合唱团abc  阅读(335)  评论(0编辑  收藏  举报