lua 环境解析

最近写一些lua文件 遇到的一些环境问题  跟大家分享一下
1.平时环境
平时大家如果不更改环境的话  其实都是在_G的环境写编写的 也就是说
gname = "1111111111"
print(_G.gname)

是会输出1111111111的 这里的_G 可以理解为 lua先自己写了
table  _G = {
--
}
然后大家定义的全局变量都在这个table之中
2.自己更改环境
-- 将当前全局环境重新设置为新的table
setfenv(1, {});
gname = "1111111111"
print(gname)

此时当前的环境就会报错  不认识这个print 因为当前的环境已经变成了另外一个table

3.更改的环境引用其他的函数
gName = "1111111111";
	-- 将当前全局环境重新设置为新的table
setfenv(1, {g = _G}); 
g.print(gName);
-- 再次定义一个全局变量
gName = "2222222222";
-- 再次输出值
g.print(gName);
-- 输出原来的值
g.print(g.gName);

此时的输出结果是:
nil
2222222222
1111111111
如何理解?
我们转换一下
table   _G = {
   gName = "1111111111"
   function print()   --  具体内容不写
   end
}
以上就相当于setfenv(1, {g = _G});这个语句之前的环境
g = G
table 当前 = {
   g.print(gName)
   gName = "2222222222"
   g.print(gName)
   g.print(g.gName)
}
以上就相当于setfenv(1, {g = _G})这个语句之后的环境
所以g.print 调用的是table_G中的print
而第一个输出的就是没有值的  为nil  因为这个语句之前根本就没有定义过gName
而第二个输出的是222222222222  这个是本环境下的全局变量
而第三个输出的是1111111111  因为它引用的是_G环境下的变量

猜你喜欢

转载自ligang7895123.iteye.com/blog/2269574