自己动手实现Lua(三)Lua注册表和全局变量

Lua给用户提供了一个注册表,这个注册表实际上就是一个普通的Lua表,所以用户可以在里面存放任何Lua值。有趣的是,这个注册表虽然是给用户准备的,但Lua本身也用到了它,比如说Lua全局变量就是借助这个注册表实现的。

预先会往注册表中放入一个全局环境,全局环境也是一个普通的Lua表,所有的Lua全局变量都放在这个表中。因为全局环境的使用比注册表还要频繁一些,所以Lua API提供了专门的方法来操作全局环境。

例子:

在上面这段脚本里,f 和 g 都没有定义x和y变量,但却可以直接使用,反编译一下:

g:

 f:

main:

 到这里可以看出来,全局变量实际上就是某个特殊的表的字段,而这个特殊的表就是上面提到的全局环境。Lua编译器在生成main函数的时候会在它的外围声明一个局部变量_ENV,类似下面这样:

 然后编译器会把全局变量的读写翻译成_ENV字段的读写,也就是说,全局变量实际上也是语法糖,去掉语法糖后大概是这样:

 

Lua的变量可以分为三类:局部变量在函数内部定义(本质上是函数调用帧里的寄存器),Upvalue是直接或间接外围函数定义的局部变量,全局变量则是全局环境表的字段(通过隐藏的Upvalue,也就是_ENV进行访问)。

 

posted @   mc宇少  阅读(380)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示