lua-设计与实现-8环境与模块

8.1环境

含义: 与环境相关的特殊变量一--Global表、env表、registry表以及UpValue 。

  • Global表存放在lua_State 结构体中也称为G表。每个lua_State 结构体都有一个对应的G表。不用多说,这个表就是存放全局变量的。
  • env表存放在Closure 结构体中,也就是每个函数有自己独立的一个环境。
  • registry表是全局唯一的,它存放在global_State结构体中,这个结构体在整个运行环境中只有一个。

作用:

在讲解OP_GETGLOBAL以及OP_SETGLOBAL指令时说到,查找一个全局变量的操作,其实更精确地说,是在当前函数的en v表中查找:

8.2

8.2.2 require

做几件事:
1,在registry[ "_LOADED”]表中查找该库,如果已存在,return (等同于package.loaded[module_name] 吧)
2,遍历环境表中的loaders 来调用,如果加载的结果在Lua找中返回的是函数,停止遍历
3,调用lua_call尝试加载该模块。成功,则记录在registry[ "_LOADED”]

static const lua_CFunction loaders[] =
  {loader_preload, loader_Lua, loader_C, loader_Croot, NULL};
原文地址:https://www.cnblogs.com/Jaysonhome/p/13396023.html