之前介绍 Lua 的数据类型时,也提到过,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。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]