编写模块时,文件在全局环境中运行,而不是在调用环境中运行:
-- other_file.lua
require('my_file')
-- my_file.lua
getfenv(2) == getfenv(0) -- true
setfenv(1, {}) -- or module(...)
getfenv(2) == getfenv(0) -- true
Run Code Online (Sandbox Code Playgroud)
我永远不记得读到这个.是在任何地方提到/记录的吗?
(这个问题更多的是关于require
而不是getfenv
.我知道它已经在5.2中删除了.)
它没有明确记录,但是如果没有任何精确的陈述,你应该假设它的工作方式与Lua的其余部分一样,即使用全局环境.
dofile
也在全局环境中运行文件,而不是在调用环境中运行.换句话说,dofile
与include
Lua没有的不一样.
require
本质上是一个dofile
支持路径和缓存加载文件的版本.因此,它还在全局环境中运行文件,而不是在调用环境中运行.