什么是上值?
理解闭包如何从外层作用域捕获变量作为上值。
什么是上值? 是 CoddyKit 上的免费 Lua Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Lua Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Lua Academy 课程共包含 4 节课。
闭包回顾
闭包是一个函数,它与对其外围作用域中变量的引用绑定在一起。这些被捕获的变量称为上值。
上值示例
内部函数从外部函数的作用域中捕获了 count。
local function makeCounter()
local count = 0
return function()
count = count + 1
return count
end
end
local next = makeCounter()
print(next()) -- 1
print(next()) -- 2上值是活跃变量
上值不是副本,而是指向变量的引用。闭包既可以读取它们,也可以写入它们。
多个上值
闭包可以从多个外层作用域捕获多个变量。
local function adder(x)
return function(y) return x + y end
end
local add5 = adder(5)
print(add5(3)) -- 8上值的生命周期
只要还有引用它的闭包存活,上值就会一直存在。只有当所有引用它们的闭包都被回收后,上值才会被垃圾回收。
debug.getupvalue
您可以使用 debug.getupvalue(fn, n) 检查上值;它会返回第 n 个上值的名称和值。
local x = 10
local function f() return x end
print(debug.getupvalue(f, 1)) -- x 10上值与全局变量
上值(由闭包捕获的局部变量)比全局变量更快。VM 可以通过索引直接访问它们,无需查找表。
已关闭的上值
当外层代码块退出时,上值会被关闭:从栈移动到堆中。闭包仍会继续共享这个堆单元。
开放上值与已关闭上值
开放:上值仍在栈上(外层函数仍在运行)。已关闭:外层作用域结束后,上值已迁移到堆中。
实际应用场景
上值可以在闭包中自然地实现私有状态——模块函数无需将状态暴露为全局变量,就能保留私有状态。
local id = 0
local function newId()
id = id + 1
return id
end上值数量限制
每个 Lua 函数最多可以引用 255 个上值。实际应用中很少需要担心这一限制。
上值问题
什么是上值?
回顾:上值
上值是闭包捕获的外层变量。外层作用域退出后,它们仍会保留在堆中,并通过引用共享,从而无需全局变量即可提供私有的可变状态。
常见问题解答
「什么是上值?」课时是免费的吗?
是的 — 「什么是上值?」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Lua Academy 课程的其余内容,请升级到 CoddyKit PRO。 Lua Academy 课程共包含 4 节课。
「什么是上值?」这节课中我会学到什么?
理解闭包如何从外层作用域捕获变量作为上值。 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Lua Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Lua Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「什么是上值?」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Lua Academy 课中编写并运行代码吗?
能。每节 Lua Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。