lua 环境解析

最近写一些lua文件 遇到的一些环境问题 跟大家分享一下
[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环境下的变量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值