我对如何实现闭包有疑问。
假设这是在名为test.lua
的文件中:
local a = 'asdf'
local function b()
return a
end
a = 10
return b
另一个文件
a = require 'test'
a()
它会打印
10
如果a
是堆栈上的指针'asdf'
(在我假设的堆上,但没关系),并且创建了闭包b
,大概就是地址a
中的b
保存用于a = 10
,b
如何更改闭包内的指针?
维基百科很好地说了令我困惑的事情:
如果语言实现的运行时内存模型在线性堆栈 1 上分配所有局部变量,则它无法轻松支持完全闭包。在这些语言中,函数返回时会释放函数的局部变量。
我在想,或许'asdf'
确实没有保存指向a
的指针,而是将堆栈偏移量保存到a
,以便您可以更改a
和堆栈offset会让你到a
,它指向你设置a
的最后一件事,但是当{{1}}(指针)从堆栈中弹出并且堆栈偏移时,这是如何工作的变得无效?
1 我知道Lua没有在堆栈上分配值,但是它将堆栈上的本地指针分配给堆中的值,不是吗?
答案 0 :(得分:21)