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

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

    之前对closure一知半解,在网上也找不到一篇文章能把它说清楚,今天好像第一次对它有点清晰的了解 了,写个BLOG记念一下

    lua的函数是一种 First-Class Value 的东西, 到底是啥?
    就是它们与传统类型的变值没啥区别,
    可以 存到一个变量中,
    可以 存到table中,
    可以 作为实参传递给其它函数,
    可以 作为其它函数的返回值.

    它们还具有特定的词法域(Lexical Scoping), 也就是说, 一个函数可以嵌套在另一个函数中, 内部的函数可以访问外部函数中的变量.
    如下面的例子:

    复制代码 代码如下:

    function test(x)
        return function (value)
            return value * x
        end
    end

    func = test(10)

    print( func(11) )


    在test()中,嵌套了一个匿名函数作为返回值, 而在这个匿名函数中 可以访问外部的 value 变量
    再看另一个例子
    复制代码 代码如下:

    function newCounter()
            local i = 0
            func = function()
                    i = i + 1
                    return i
            end

            return func
    end

    c = newCounter()
    print(c())
    print(c())

    c1 = newCounter()
    print(c1())
    print(c1())


    代码中, 函数 func 里访问了一个 "非局部的变量" i, 用于保存一个计数器
    初步看,由于创建变量i的函数 newCounter 已经返回, 所以每次调用 func 时, 应该是超过了作用范围

    其实不然, lua 会以 closure 的概念来处理这种情况.
    一个 closure 就是一个函数加上该函数所需访问的所有"非局部的变量"

    所以上例中 c1, c2 是同个函数所创建的两个不同的 closure, 它们各自拥有局部变量i的独立实例.

    从技术上来讲, lua中只有 closure, 而不存在"函数". 因为"函数"本身就是一种特殊的 closure.

    后记,C++的类对象不也可以达到类似的效果?

    您可能感兴趣的文章:
    • Lua学习笔记之表和函数
    • Lua进阶教程之闭包函数、元表实例介绍
    • Lua基础教程之赋值语句、表达式、流程控制、函数学习笔记
    • Lua中的闭包小结
    • Lua中的闭包学习笔记
    • Lua学习笔记之函数、变长参数、closure(闭包)、select等
    • lua闭包的理解以及表与函数的几种表达方法
    上一篇:Lua中实现递归删除一个文件夹
    下一篇:安装Nginx+Lua开发环境
  • 相关文章
  • 

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

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

    LUA中的闭包(closure)浅析 LUA,中的,闭包,closure,浅析,