最近写一些lua文件 遇到的一些环境问题 跟大家分享一下
[size=medium]1.平时环境[/size]
平时大家如果不更改环境的话 其实都是在_G的环境写编写的 也就是说
是会输出1111111111的 这里的_G 可以理解为 lua先自己写了
table _G = {
--
}
然后大家定义的全局变量都在这个table之中
[size=medium]2.自己更改环境[/size]
此时当前的环境就会报错 不认识这个print 因为当前的环境已经变成了另外一个table
[size=medium]3.更改的环境引用其他的函数[/size]
此时的输出结果是:
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环境下的变量
[size=medium]1.平时环境[/size]
平时大家如果不更改环境的话 其实都是在_G的环境写编写的 也就是说
gname = "1111111111"
print(_G.gname)
是会输出1111111111的 这里的_G 可以理解为 lua先自己写了
table _G = {
--
}
然后大家定义的全局变量都在这个table之中
[size=medium]2.自己更改环境[/size]
-- 将当前全局环境重新设置为新的table
setfenv(1, {});
gname = "1111111111"
print(gname)
此时当前的环境就会报错 不认识这个print 因为当前的环境已经变成了另外一个table
[size=medium]3.更改的环境引用其他的函数[/size]
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环境下的变量