当前位置: 首页 > 编程笔记 >

LUA中的闭包(closure)浅析

杨经武
2023-03-14
本文向大家介绍LUA中的闭包(closure)浅析,包括了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++的类对象不也可以达到类似的效果?

 类似资料:
  • 本文向大家介绍C# 中闭包(Closure)详解,包括了C# 中闭包(Closure)详解的使用技巧和注意事项,需要的朋友参考一下 C# 中闭包(Closure)详解 这个问题是在最近一次英格兰 Brighton ALT.NET Beers 活动中提出来的。我发现,如果不用代码来演示,你很难单用话语把它解释清楚,所以,在这里,我打算用 C# 来解释一下什么是闭包(closures)。维基百科上说:

  • 主要内容:在闭包内部修改引用的变量,示例:闭包的记忆效应,示例:闭包实现生成器Go语言中闭包是引用了自由变量的函数,被引用的自由变量和函数一同存在,即使已经离开了自由变量的环境也不会被释放或者删除,在闭包中可以继续使用这个自由变量,因此,简单的说: 函数 + 引用环境 = 闭包 同一个函数与不同引用环境组合,可以形成不同的实例,如下图所示。 图:闭包与函数引用 一个函数类型就像结构体一样,可以被实例化,函数本身不存储任何信息,只有与引用环境结合后形成的闭包才具有“记忆性”,

  • 本文向大家介绍Javascript闭包(Closure)详解,包括了Javascript闭包(Closure)详解的使用技巧和注意事项,需要的朋友参考一下 下面就是我的学习笔记,对于Javascript初学者应该是很有用的。 一、变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域。 变量的作用域无非就是两种:全局变量和局部变量。 Javascript语言的特殊之处,就在于函

  • 本文向大家介绍JavaScript中的闭包(Closure)详细介绍,包括了JavaScript中的闭包(Closure)详细介绍的使用技巧和注意事项,需要的朋友参考一下 闭包是JavaScript中一个重要的特性,其最大的作用在于保存函数运行过程中的信息。在JavaScript中,闭包的诸多特性源自函数调用过程中的作用域链上。   函数调用对象与变量的作用域链   对于JavaScript中的每

  • 本文向大家介绍学习Javascript闭包(Closure)知识,包括了学习Javascript闭包(Closure)知识的使用技巧和注意事项,需要的朋友参考一下 一、变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域。 变量的作用域无非就是两种:全局变量和局部变量。 Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。 另一方面,在函数外部自然无法读取

  • 本文向大家介绍Lua中的函数浅析,包括了Lua中的函数浅析的使用技巧和注意事项,需要的朋友参考一下 一、函数 在lua中函数的调用方式和C语言基本相同。 如print(“hello world”), z=add(x+y)。唯一的差别是,如果函数只有一个参数,并且该参数是字符串或者table构造器,那么圆括号可以省略,如print “hello world”, f{x=10,y=10}。 我对于ta