LUA中的闭包(closure)浅析

(编辑:jimmy 日期: 2024/10/5 浏览:2)

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

lua的函数是一种 First-Class Value 的东西, 到底是啥"codetitle">复制代码 代码如下:
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++的类对象不也可以达到类似的效果?

一句话新闻
微软与英特尔等合作伙伴联合定义“AI PC”:键盘需配有Copilot物理按键
几个月来,英特尔、微软、AMD和其它厂商都在共同推动“AI PC”的想法,朝着更多的AI功能迈进。在近日,英特尔在台北举行的开发者活动中,也宣布了关于AI PC加速计划、新的PC开发者计划和独立硬件供应商计划。
在此次发布会上,英特尔还发布了全新的全新的酷睿Ultra Meteor Lake NUC开发套件,以及联合微软等合作伙伴联合定义“AI PC”的定义标准。