有没有办法在Lua 5.1中每次需要模块时调用函数?
问题描述:
例如,要更改需求文件的环境?就我而言,我创建构建行为树DSL(领域特定语言),这将是很好,如果我可以做这样的事情:有没有办法在Lua 5.1中每次需要模块时调用函数?
require "behaviortree"
return Sequence {
-- definition of tree
}
,不污染与节点名称全局命名空间,或使用构造像
require "behaviortree".init()
因为这在我看来有点丑。简单地将一个setfenv调用放在模块文件的主体中并没有达到我想要的,因为只有当我第一次需要模块时才会调用setfenv调用,而不是每次都需要模块缓存。
我想过清理出每次我需要它的时候模块的高速缓存,但是这意味着我需要做的是这样
require "behaviortrees"
local tree = Sequence {
-- definition of tree
}
create(tree)
并清除缓存模块中创建函数。这也是我想避免的,但是比调用模块的init函数更好。
是否有任何'干净'的方式来使用模块来设置所需文件的环境?
答
编写自己的require
函数,使用“原始”require加载模块,然后调用您需要的函数init
。即使“原始”要求返回缓存版本,您自己的require
函数仍将调用init
函数。
你可以'dofile'而不是'require'。这根本不会缓存,但只适用于Lua模块。 –
@亨利梅克谢谢,我没有想到这一点。但是,如果可能的话,我真的很希望保留所要求的“行为主义”路线,纯粹为了美学目的。 –
“返回false”的模块没有被缓存,并且在每个“require”调用时重新加载。 – siffiejoe