• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Lua中的闭包学习笔记

    之前介绍 Lua 的数据类型时,也提到过,Lua 的函数是一种“第一类值(First-Class Value)”。它可以:

    存储在变量或 table (例如模块和面向对象的实现)里

    复制代码 代码如下:

    t = { p = print }
    t.p("just a test!")

    作为实参(也称其为“高阶函数(higher-order function)”)传递给其他函数调用

    复制代码 代码如下:

    t = {2, 3, 1, 5, 4}
    table.sort(t, function(a, b) return (a > b) end)

    作为其他函数的返回值

    复制代码 代码如下:

    function fun1(x) return fun2(x) end

    函数在 Lua 里“第一类值”的特性,使它成为一种灵活,极具弹性的数据类型,同时,也让它衍生出一些特殊的功能强大的语言机制:

    闭包(closure)

    Lua 中的函数是带有词法作用域(lexical scoping)的第一类值,也可以说是函数变量的作用域,即函数的变量是有一定的效用范围的,变量只能在一定范围内可见或访问到。

    例如如下代码:

    复制代码 代码如下:

    function count()
        local uv = 0
        local function retfun()
            uv = uv + 1
            print(uv)
        end
        return retfun
    end

    上面函数 retfun 定义在函数 count 里,这里可以把函数 retfun 看作是函数 count 的内嵌(inner)函数,函数 count 视为函数 retfun 的外包(enclosing)函数。内嵌函数能访问外包函数已创建的所有局部变量,这种特征就是上面所说的词法作用域,而这些局部变量(例如上面的变量 uv)则称为该内嵌函数的外部局部变量(external local variable)或 upvalue。

    执行函数 count :

    复制代码 代码如下:

    c1 = count()
    c1()            -- 输出 1
    c1()            -- 输出 2

    上面两次调用 c1,会看到分别输出 1 和 2。

    对于一个函数 count 里的局部变量 uv,当执行完 "c1 = count()" 后,它的生命周期本该结束,但是因为它已成了内嵌函数 retfun 的外部局部变量 upvalue,返回的内嵌函数 retfun 以 upvalue 的方式把 uv 的值保存起来,因此可以正确把值打印出来。

    这种局部变量在函数返回后会继续存在,并且返回的函数可以正常调用那个局部变量,独立执行其逻辑操作的现象,在 Lua 里称之为闭包(closure)

    之所以说闭包是一个独立存在的个体,这个可以再把函数 count 赋给一个变量,然后执行看输出效果:

    复制代码 代码如下:

    c2 = count()
    c2()                --  输出 1

    c1 跟 c2 都是相同的函数体,不过输出的值却不一样!这主要还是因为闭包是由相应函数原型的引用和外部局部变量 upvalue 组成。当调用函数造成 upvalue 值被改变时,这只会改变对应闭包的 upvalue 值,不会影响到其他闭包里的 upvalue 值,所以 c1 被调用 2 次后,外部局部变量 uv 的值的是 2,而新创建的 c2 初始的外部局部变量 uv 是 0,被调用之后会是 1。

    您可能感兴趣的文章:
    • Lua学习笔记之表和函数
    • Lua进阶教程之闭包函数、元表实例介绍
    • Lua基础教程之赋值语句、表达式、流程控制、函数学习笔记
    • Lua中的闭包小结
    • LUA中的闭包(closure)浅析
    • Lua学习笔记之函数、变长参数、closure(闭包)、select等
    • lua闭包的理解以及表与函数的几种表达方法
    上一篇:Lua面向对象编程学习笔记
    下一篇:Lua中的元表和元方法学习笔记
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Lua中的闭包学习笔记 Lua,中的,闭包,学习,笔记,