lua全局环境变量_G小结

1.以一个模块(*.lua,后同)为单位,所有的全局变量都保存在table中,这个table放在_G中,这是一个全局空间(全局环境变量),可以简单的看作一个表。

2._G中只保存全局变量,不保存局部变量。

3.lua中真正存储全局变量的地方不是在_G里面,而是在setfenv(i,table)的table中,所有当前的全局变量都在这里面找,只不过在程序开始时lua会默认先设置一个变量_G=这个里面的table而已。所以在新设置环境后,如果还想找到之前的全局变量,通常需要附加上为新的table设置元表{_index=_G}。setfenv的第一个参数可以是当前的堆栈层次,如1代表当前代码块,2表调用当前的上一层,也可以是具体的那个函数名,表示在那个函数里。

4.全局环境变量_G一个很重要的应用是lua服务器的热更新

看下几个例子:

a=1
print(a)
print(_G.a)
--正常情况,输出1,1

a=1
setfenv(1,{})
print(a)
print(_G.a)
--这时会出错说找不到print,因为当前的全局变量表示空的,啥也找不到的

local mt={__index=_G}
local t={}
setmetatable(t,mt)
setfenv(1,t)
print(a)
print(_G.a)
--这是正确输出,因为新的全局表采用之前的表做找不到时的索引,原先的表里面存在print 、_G、 a这些东西
local b = 3
local newg = {}
setmetatable(newg, {__index = _G})--绑定到newg新的table 空间中
setfenv(1, newg)--改变环境,设定到newg
a = 10
print(a) ---》10
print(_G.a) _G,还是原来的空间 --》1
print(_G.b) --->nil,因为所有全局变量才会存到_G空间,去取b的话,_G里面会找不到这个定义,结果为nil

print(b) --->3,因为所有全局变量才会存到_G空间,这个时候也就是local是定义到了newg空间里面
function factory()
        return function()
           return a
	end
end

a = 4

f1 = factory()
f2 = factory()

print(f1())
print(f2())


setfenv(f1, {a = 5}) --这里设置函数为环境的时候,f1中的return a是受到table {a = 5}的影响(由于setfenv的第一个参数为f1),
print(f1())--->5
print(f2())--4


热更新相关文章看上一篇文章   

http://blog.csdn.net/peter_teng/article/details/52751231





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值