Lua之变量环境

在lua定义的全局变量都存table中,这个table放在空间_G里面,和C/C++里面的namespace 一样,我们通过代码来解释吧!

a = 1
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

还有更简洁的方法:

a = 10
local _M = _G --定义局部变量
setfenv(1, _M) --_Mtable
print(a)


 



 

你可能感兴趣的:(Lua之变量环境)