5.lua学习笔记:函数

来源:互联网 发布:大数据调查内容 编辑:程序博客网 时间:2024/05/21 09:23
1.多重赋值:
    在lua中可以多重赋值,和Python类似:
        a, b = 1, 2
    这样就能在函数中返回多个值了,并且lua的多重赋值更加智能,当值得个数多于变量的个数时,多余的值将被舍弃;
    当变量的个数多于值得个数时,多余的变量将被赋值为nil;Python中的多重赋值需要变量和值得个数对应

    如果在表达式中调用具有多重返回值的函数,只有函数在表达式的末尾时,表达式才能获取函数的所有结果,否则只能获取函数的第一个结果;
    function test()
return 1,2,3
    end
   
   a, b = test(), 4       ------a==1, b==4
   a, b = 4, test()       ------a==4, b==1
   a, b, c = 4, test()   ------a==4, b==1, c==2 (多余的值舍弃)
    

2.变长参数:
    lua中可以编写接受变长参数的函数,通过使用...来获取变长参数
    如:
        function  add(...)
            local sum = 0
            local args = {...}
            for k,  v in ipairs(args)  do
                sum = sum + v
            end
            return sum
        end
当一个函数的参数只有一个table的构造式时,函数调用的小括号是可有可无的,上面的代码可改为:
    function  add(...)
        local sum = 0
        for  k,   v   in   ipairs{...}  do   --红色部分是个大括号+...
                sum = sum + v
        end
        return sum
    end

3.默认值参数:
    lua中的默认值参数不像其他语言那么方便,需要借助table来实现,如:
    function   testArgs(arg)
            old = arg.old  or  0
            now = arg.now  or  0
            if now > old then
                print("now bigger than old")
           else
                print("now litter than old")
            end
    end
调用测试:
testArgs({})          --now litter than old
testArgs{now=1} --now bigger than old


深入函数:
    lua中函数名其实也是变量,函数的定义相当于赋值语句,

    function  f(x)  return  2*x  end
    
    f = function(x)  return  2*x  end    


4.闭包closure:
    闭包就是在函数内部再定义一个函数,内部函数能够访问外部函数的局部变量,即时已经超出了外部函数的作用域;
相当于将外部函数的局部变量与内部函数绑定,使内部函数可以随意的访问,同时保留上一次访问的结果。
    如:
        function  test()
            local  i  =  0
            function  _test()
                    i  =  i  + 1
                    return i
            end
            return _test
        end

    t = test()       -- t == _test, 此时局部变量i就跟函数t绑定了,i就相当于函数t内的static变量
    t()                 -- 1
    t()                 -- 2
    t()                 -- 3

5.非全局函数:
    lua中,函数其实是匿名的,通常定义的函数是将匿名函数赋值给变量,所以,定义局部函数同定义局部变量一样;
    local  test
    test = function (x, y)   return  x+y   end
    这样test就是一个局部函数了






0 0
原创粉丝点击