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

  • 相关阅读:
    vue使用laydate.js插件报错laydate.css: Invalid
    自定义css样式结合js控制audio做音乐播放器
    福利福利~262集前端免费视频!
    解决Vue在IE中报错出现不支持=>等ES6语法和“Promise”未定义等问题
    设置Chart.js默认显示Point点的值不用鼠标经过才显示
    js监听某个元素高度变化来改变父级iframe的高度
    Vue中注意target和currentTarget的使用
    VUE中让由全局变量添加生成的新数组不随全局变量的变化而变化
    bootstrap-table前端实现多条件时间段查询数据
    js小数点相乘或相除出现多位数的问题
  • 原文地址:https://www.cnblogs.com/ljygoodgoodstudydaydayup/p/4462428.html
Copyright © 2011-2022 走看看