Lua学习之闭包概念
2012-09-01 20:53
274 查看
学习Lua的迭代器的时候有个闭包的概念,这个很特别。
Lua中的函数是一阶值,就是说函数可以作为参数,返回值,可以作为右值赋给变量。那么在一个函数内就可以再定义函数,就像定义一个变量一样。内部函数可以访问外部函数的局部变量,这种变量又叫upvalue。闭包的实现关键就是这个upvalue。
简单来区分函数和闭包的区别。可以说函数是特殊的闭包,而闭包不是函数。闭包是函数和起运行环境的整体。
写个例子:
function newCounter()
local i = 0
return function()
i = i+1
return i
end
end
我的理解是,闭包是函数和他的upvalue组成的整体。我不知道这个upvalue变量是怎么实现的,网上有资料说是这个变量会被保存在堆栈,调用的时候会创建其副本,不管怎么样,闭包的外在表现就是可以保存这个upvalue变量,后续调用可以访问这个变量。
如果有兴趣可以看起源码实现。
不知道说清楚了没有,就当做个笔记吧。
Lua中的函数是一阶值,就是说函数可以作为参数,返回值,可以作为右值赋给变量。那么在一个函数内就可以再定义函数,就像定义一个变量一样。内部函数可以访问外部函数的局部变量,这种变量又叫upvalue。闭包的实现关键就是这个upvalue。
简单来区分函数和闭包的区别。可以说函数是特殊的闭包,而闭包不是函数。闭包是函数和起运行环境的整体。
写个例子:
function newCounter()
local i = 0
return function()
i = i+1
return i
end
end
c1=newCounter() print(c1()) print(c1())看这段代码,匿名函数访问一个upvalue i,这个变量用来保存一个计数器。第一次调用的时候肯定会打印1。第二次调用会打印多少呢。答案是2。
我的理解是,闭包是函数和他的upvalue组成的整体。我不知道这个upvalue变量是怎么实现的,网上有资料说是这个变量会被保存在堆栈,调用的时候会创建其副本,不管怎么样,闭包的外在表现就是可以保存这个upvalue变量,后续调用可以访问这个变量。
如果有兴趣可以看起源码实现。
不知道说清楚了没有,就当做个笔记吧。
相关文章推荐
- 新手初学习javascript的闭包(closure)概念
- lua的闭包概念理解与介绍
- Lua学习笔记之函数、变长参数、closure(闭包)、select等
- lua的闭包概念理解与介绍
- Lua学习之--函数,变长参数,closure(闭包)及select的一些特性
- lua语言中闭包的学习心得
- 编译原理之学习 lua 3.1 (七) Closure 闭包支持
- 从两个函数来学习js闭包的概念
- Lua语言学习(一)------Lua语言闭包代替范性for语义的迭代器的原理
- 【javascript基础】由demo来进阶学习闭包等概念
- 学习 lua中的闭包
- 原来 JS 也支持跟 Lua 语意一样的内嵌函数的闭包概念
- lua 闭包的概念
- LUA闭包概念演示
- Lua学习——闭包、迭代器
- Lua学习之--函数,变长参数,closure(闭包)及select的一些特性
- 原来 JS 也支持跟 Lua 语意一样的内嵌函数的闭包概念
- 深入理解Lua的闭包一:概念和应用
- Lua 闭包知识点 -- 学习过程笔记,会比较乱
- Lua中的闭包学习笔记