有没有办法在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函数更好。

是否有任何'干净'的方式来使用模块来设置所需文件的环境?

+0

你可以'dofile'而不是'require'。这根本不会缓存,但只适用于Lua模块。 –

+0

@亨利梅克谢谢,我没有想到这一点。但是,如果可能的话,我真的很希望保留所要求的“行为主义”路线,纯粹为了美学目的。 –

+2

“返回false”的模块没有被缓存,并且在每个“require”调用时重新加载。 – siffiejoe

编写自己的require函数,使用“原始”require加载模块,然后调用您需要的函数init。即使“原始”要求返回缓存版本,您自己的require函数仍将调用init函数。