您的位置:首页 > 编程语言 > Lua

lua探索--------------(setfenv、getfenv相关)

2016-04-07 20:49 501 查看
newfenv = {}
setfenv(1,newfenv)
print(1)------attempt to call global 'print'(a nil value)


———————猜想分割线—————————————-

这是因为setfenv(1,newfenv)调用之后当前环境就被切换到了newfenv里,newfenv是一个global空表,里面是没有print的

newfenv = {}
setmetatable(newfenv,{__index = _G})
setfenv(1,newfenv)
a = 2
print(a)----------2


空表newfenv继承了_G,所以这段代码等于废话(真诚的表情)

newfenv = {_G = _G}
a = 2
setfenv(1,newfenv)
_G.print(a)----------nil


这里a为nil,是因为环境被切换称newfenv了,里面没有a这个字段,如果在a的前面加上_G就可以访问了

newfenv = {_G = _G}
setfenv(1,newfenv)
a = 2
_G.print(a)----------2


上面两段代码的结果不一致,猜想应该是setfenv这个函数调用的那一刻起,环境就切换完毕了,并且a变成了_G.newfenv的字段,前面那段代码的a的环境是_G,后面那段代码a的环境是newfenv,神奇~~~

local a = function() end
print(_G)-------table:00XXXXX
print(getfenv(a))--------table:00XXXX


上面证明裸代码中的变量或者函数或者其他的东东默认是在_G环境中
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: