每次在Lua 5.1中需要模块时,有没有办法调用函数?

时间:2017-07-16 23:00:41

标签: lua dsl

例如,要更改require文件的环境?在我的例子中,我正在创建一个用于构建行为树的DSL(领域特定语言),如果我可以做这样的事情会很好:

require "behaviortree"

return Sequence {
    -- definition of tree
}

不使用节点名称或使用类似

的构造来污染全局命名空间
require "behaviortree".init()

因为在我看来这有点难看。简单地将一个setfenv调用放在模块文件的主体中并不能满足我的需要,因为它只会在我第一次需要模块时调用,而不是每次都因为require的模块缓存而调用。

我想过每次需要时清除模块的缓存,但这意味着我需要做类似的事情

require "behaviortrees"

local tree = Sequence {
    -- definition of tree
}

create(tree)

并清除create function中的模块缓存。这也是我想避免的,但是比调用模块的init函数更好。

使用模块设置需求文件的环境是否有“干净”的方式?

1 个答案:

答案 0 :(得分:2)

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