zoukankan      html  css  js  c++  java
  • 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)..'	'
        end
        result=result..'
    '
    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尾调用之后程序不需要在栈中保留关于调用者的任何信息,所以是支持正确的尾调用

  • 相关阅读:
    真正的e时代
    在线手册
    UVA 10616 Divisible Group Sums
    UVA 10721 Bar Codes
    UVA 10205 Stack 'em Up
    UVA 10247 Complete Tree Labeling
    UVA 10081 Tight Words
    UVA 11125 Arrange Some Marbles
    UVA 10128 Queue
    UVA 10912 Simple Minded Hashing
  • 原文地址:https://www.cnblogs.com/ljygoodgoodstudydaydayup/p/4462428.html
Copyright © 2011-2022 走看看