0Pricing
Lua Academy · 课时

什么是上值?

理解闭包如何从外层作用域捕获变量作为上值。

什么是上值? 是 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 什么是上值?
  2. 闭包之间共享上值
  3. 工厂函数和生成器
  4. 使用闭包实现记忆化
← 返回 Lua Academy