自己动手实现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 @ 2023-06-13 19:06  mc宇少  阅读(342)  评论(0编辑  收藏  举报