美文网首页
lua闭包函数

lua闭包函数

作者: 亮亮同学 | 来源:发表于2019-11-21 19:18 被阅读0次

    简单释义:函数里套函数,里层函数可以访问外层函数的所有局部 变量

    1,lua中函数是第一类值 (他们可以存储在变量中,做为参数传递给其他函数或者做为结果返回)

    lua函数可以保存在变量中

    local tbl = {}
    tbl.a = print
    
    tbl.a("输出")
    
    --[[
        print函数赋值给 tbl表中a变量 ,那么a变量 就指向print函数 ,拥有print函数的功能
    ]]
    

    结果:
    输出

    2,lua中的函数 都是没有名字的 (匿名)

    函数的构造:

    function (var)
      --dosomething
    end
    

    为什么平时看到的lua函数 都是这种形式

    function name(var)
    -do something
    end
    

    其实是 一种美观的写法 这种写法等同于

    local name = function(var)
    --do something
    end
    

    实际上是 将 一个函数 赋值给了一个变量

    代码示例:

    local log = function(var)
        print(var)
    end
    
    log("这是一个函数赋值给了log变量")
    

    结果:
    这是一个函数赋值给了log变量

    local  function log(var)
        print(var)
    end
    log("这是一个函数的美观写法")
    

    结果:
    这是一个函数的美观写法

    3,高阶函数(以函数作为参数的函数)

    语法:

    function name(var,function)
      --dosomething
    end
    

    代码:以lua标准库的排序函数table.sort()为例

    --------------辅助函数,用于打印表(table)-------------
    
    local str = "" --连接字符串
    local count = 2
    function getTblLen(tbl)
        local num = 0
        for k,v in pairs(tbl) do
            num = num +1
        end
        return num
    end
    function dump(tbl)
        local num1 = 0
        for k,v in pairs(tbl) do
            if type(v) == "table" then 
                num = getTblLen(v)
                num1 = 0
                dump(v)
            else
                num1 = num1 + 1
                if num == num1 then 
                    str = str..k.."="..v..","
                else
                    str = str..k.."="..v.." "
                end
            end 
        end
    end
    ------------------------end
    --按照年龄(age)升序排列表
    local tblPerson = {
      {name = "mayun" ,age = 18},
      {name = "liqi" ,age = 43},
      {name = "ruhua" ,age = 21},
    }
    --以下是高阶函数,sort是以一个函数为参数的函数
    table.sort(tblPerson,function(a,b)
        return a.age < b.age
        end)
    dump(tblPerson)
    print(str)
    

    --结果:name=mayun age=18,name=ruhua age=21,name=liqi age=43,

    4,闭包(内层函数能访问外层函数的所有局部变量)

    代码:

    
    function log()
    
        local arg = 10
    
        --返回匿名函数(记住lua中的函数默认都是匿名的)
        return function ()
            arg = arg + 10   --匿名函数访问了log函数的arg变量
            return arg
        end 
    end
    
    local fuc = log()-- 将匿名函数赋值给fuc 
    print(fuc())--打印fuc的返回值
    print(fuc())--打印fuc的返回值
    

    结果:
    --->20
    --->30

    在上述代码中 像arg 变量在log函数中 但又能被 log中匿名函数 所访问的 变量 称为 非局部变量 ,上述代码中 调用 log函数时 ,创建arg 的log函数已经返回 但是非局部变量arg还是 可以被访问,在lua中的闭包原理 可以 保持非局部变量不被释放掉,保存在内存中, 从而给实现各种功能带来了便利

    ”同一个闭包函数 保存在不同变量中 代表不同的闭包“ 事实上这句话的意思是 闭包得的名字不同 就是不同的闭包

    local fuc1 = log()
    print(fuc1())
    ---->20
    

    fuc和fuc1是不同的闭包,他们建立在相同的函数值上,但是各自拥有局部变量arg的独立实例

    相关文章

      网友评论

          本文标题:lua闭包函数

          本文链接:https://www.haomeiwen.com/subject/xnoaictx.html