我真的很感兴趣为什么代码的和平起作用并打印相同的表格。
t = {
f = function()
return t
end
}
print(t)
print(t.f())
我的假设是t
只能在定义后才能访问,因此return t
应该失败。但是这段代码似乎是矛盾的。
答案 0 :(得分:4)
由于示例中没有局部变量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。