LUA-2 lua中的全局(global)


lua中有一个全局的表,_G,这个表包含了所有的全局变量.

例如:

a = 123;

d = {a,444};

这样的两个变量实际上就会被lua存储到_G表中去.也就是说_G["a"]就是变量a.

_G["a"] = _G["d"];这样的语句和a=d;是完全一样的.当然,既然_G也是一个表,那么我们就可以设置_G表的__index等函数来达到控制_G表的访问权限了.当然我们也可以用__newindex来防止创建新的全局变量(至于怎么做:只要在函数里调用error()函数来输出一个错误就行了,这样就可以避免创建新的全局变量,但是一般没必要这么做,当然是用rawget和rowset依旧有效).

正因为全局,所以有时候我们可能会不经意间就覆盖了别的全局变量导致错误,因此是用setfenv()函数可以改变这个情况.

setfenv()可以改变全局表.也就是说,默认的全局表是_G,我们可以新创建一个表,并把这个表作为新的全局表,那么之后创建的全局变量都会存在于这个新的表中(之前的全局数据依旧在_G中).

a = {_G = _G};-->注意,新创建一个全局表的话,原来的全局表就会被lua丢弃,为了防止原来的数据都丢失掉,因此在新的全局表a中保存原来的_G表.

setfenv(1,a);-->这样就设置好了新的全局表.但是我们还是要注意,lua自动为_G设置了各种lua的函数,但是并不会为我们新的全局表设置这些东西.

_G.print("dde");-->因此我们要这样调用lua的函数了.

-->print("ddef");这样调用就会失败,因为新的全局表中并没有print函数.

u = 456;

_G.setfenv(1,_G);-->当然,我们可以在使用完之后,可以重新将全局表设置回去,而_G.a中则有我们的数据.

print(a.u);-->输出456

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM