lua的table+setfenv+setmetatable陷阱

来源:互联网 发布:hm淘宝上代购是正品吗 编辑:程序博客网 时间:2024/05/01 10:40

--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

结果自然是无限循环

原创粉丝点击