Lua 闭包
来源:互联网 发布:js new date 前一天 编辑:程序博客网 时间:2024/04/28 08:41
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闭包简介
- lua之闭包
- Lua 闭包
- [Lua]函数闭包
- Lua 闭包
- 细究lua闭包
- lua闭包
- LUA闭包
- lua 5 闭包
- Lua闭包
- lua之闭包
- lua闭包
- lua闭包
- 【Lua】闭包
- lua入门--闭包
- 深度学习资料整理(从感知机到深度网络)
- android几种动画分析
- apache 虚拟目录设置
- Matlab在读取图像时怎么实现手动选择图像
- 基于KNN算法的约会网站配对效果 python3.2
- Lua 闭包
- hdu 1068 极大独立集 二分图最大匹配
- 0703-APP-Notification-statue-bar
- [GADSlot state]: unrecognized selector sent to instance
- 吓尿了……
- MyEclipse 快捷键
- The Zen of Python / Python之禅
- 九度 OJ 1002 grading
- js 闭包的概念