--file1.lua
x = funciton()
print("this is x")
end
-------------
--file2.lua
local t = {}
local _G = _G
setfenv(1,t) --设置了这个之后,只要是在本文件中对未声明变量的访问,全部会导致递归。
_G.setmetatable(t, {
__index = function(t, i)
if i != "x" then return end
dofile("file1.lua") --我以为这样就会把x声明为t中的一个全局变量。但是我错了。file1.lua内容加载后,是在块内出现的。都是局部变量
return t[i]
end
})
return t
-----------------
--file3.lua
require("file2")
Main_t.x()
-----------------
运行:lua file3.lua
结果自然是无限循环

本文探讨了Lua中通过设置环境变量实现模块间变量共享的方法,并尝试通过require机制加载外部文件来扩展局部作用域,最终因无限循环问题揭示了此方法的局限性。
486

被折叠的 条评论
为什么被折叠?



