如何在 Lua 5.1 中每次调用模块时调用函数?

例如,更改要求文件的环境?在我的情况下,我正在创建一种用于构建行为树的 DSL(特定领域语言),如果我可以像这样做那就太好了:

require "behaviortree"

return Sequence {
    -- 树的定义
}

而不污染全局命名空间和使用如下的构造:

require "behaviortree".init()

因为我认为那样很丑。仅在模块文件正文中放置 setfenv 调用并不能实现我的目的,因为它仅在第一次要求模块时调用,而不是每次都调用,因为要求模块缓存。

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

require "behaviortrees"

local tree = Sequence {
    -- 树的定义
}

create(tree)

并在 create 函数中清除模块缓存。那也是我想避免的事情,但比调用模块的 init 函数要好些。

是否有任何“干净”的使用模块设置要求文件环境的方法?

点赞
用户1442917
用户1442917

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

2017-07-16 23:54:21