Lua极简入门指南:全局变量
全局环境
Lua把全局变量放在一个table_G中,这个table被叫做全局环境(globalenvironment)。打印所有的全局变量名:
forninpairs(_G)doprint(n)end
_ENV(Lua5.2开始支持)
对于一个freename(名字没有绑定任何声明)var实际上会被转换为_ENV.var(每个chunk中都会存在一个名为_ENV的变量):
v1=1
localv2=2
print(_ENV.v1) -->1
print(_ENV.v2) -->nil
functionf(v3)
v4=4
localv5=5
print(_ENV.v3) -->nil
print(_ENV.v4) -->4
print(_ENV.v5) -->nil
forv6=1,2do
print(_ENV.v6) -->nil
end
end
f(3)
任何作为_ENV的值的table被叫做环境(environment)。Lua加载一个chunk的时候,此chunk的_ENV默认值为全局环境。看一个简单的例子:
print(math) -->table:000000000078BCC0
localprint=print
_ENV={}
print(math) -->nil
一个比较有趣的例子是:
a=2
do
local_ENV={print=print,a=14}
print(a) -->14
end
print(a) -->2
正如前面说的a会被转换为_ENV.a,而doend中定义了一个新的_ENV,因此第一个print(a)输出了局部变量_ENV的a的值。由此可以看到,我们可以很容易的为一个函数创建一个私有的环境:
functionfactory(_ENV)
returnfunction()
returna
end
end
f1=factory{a=6}
f2=factory{a=7}
print(f1()) -->6
print(f2()) -->7
类似的,我们在不同的函数中共享一个特定的公共环境也是很容易做到的。