我很想知道这段代码为什么可以工作,并打印相同的表格。
t = {
f = function()
return t
end
}
print(t)
print(t.f())
我曾认为 t
只有在定义之后才能被访问,因此 return t
应该会失败。但是这段代码似乎与此相矛盾。
我很想知道这段代码为什么可以工作,并打印相同的表格。
t = {
f = function()
return t
end
}
print(t)
print(t.f())
我曾认为 t
只有在定义之后才能被访问,因此 return t
应该会失败。但是这段代码似乎与此相矛盾。
t
(即:_ENV.t
)。当调用函数时,它访问_ENV变量的当前值,然后索引该_ENV值的"t"
索引。尽管在定义函数时_ENV表不包含t
,但在稍后调用它时,它确实包含t
,因此您可以访问新定义的表。local u = {
f = function()
-- Refers to the global variable `t` (that is, _ENV.t).
-- Whenever the function is called, the *current* value of `t` is returned
return t
end
}
print(u) -- prints table: 0xFOOBAR
print(u.f()) -- prints nil
t = u
print(t) --prints table: 0xFOOBAR
print(t.f()) --prints table: 0xFOOBAR
_ENV = {print = print}
print(u.f()) -- prints nil, since _ENV.t is now nil
local _ENV = {print = print, t = u}
print(u.f()) -- still prints nil, because the function definition used the
-- _ENV variable that was lexically visible at the function definition,
-- rather than the new _ENV variable that was just defined.
使用_ENV的意思是这些示例仅适用于Lua 5.2,但同样的原则也适用于Lua 5.1。
t
可以访问,即使它还没有被创建。 - oroszgyt
指的是全局变量t
,其值可以在后续阶段更改。在赋值之前,全局变量的值为nil
,赋值后变量保存了表格。您在赋值之后调用函数,因此该值是从函数返回的值。 - Mankarselocal t
。相反,我展示了在t
重新赋值之前调用f
的示例。重点是每当调用f
时,都使用当前的_ENV
值。 - Mankarset.f()
被调用时,f
的主体才会被解释。 - oroszgyt
的值。Lua是“词法作用域”。因此,在您的代码中没有其他t
在作用域内,特定变量是全局环境的t
字段。 - Tom Blodget