【问题标题】:Is there a way to call a function every time a module is required in Lua 5.1?每次在 Lua 5.1 中需要一个模块时,有没有办法调用一个函数?
【发布时间】:2017-07-17 07:54:21
【问题描述】:

例如,改变所需文件的环境?就我而言,我正在创建一个 DSL(领域特定语言)来构建行为树,如果我能做这样的事情会很好:

require "behaviortree"

return Sequence {
    -- definition of tree
}

不使用节点名称污染全局命名空间,或使用类似的构造

require "behaviortree".init()

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

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

require "behaviortrees"

local tree = Sequence {
    -- definition of tree
}

create(tree)

并在创建函数中清除模块缓存。这也是我想避免的事情,但比调用模块的 init 函数更好。

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

【问题讨论】:

  • 你可以用dofile 代替require。这根本不缓存,但只适用于 Lua 模块。
  • @HenriMenke 谢谢,我没想到。但如果可能的话,我真的很想保留 require “behaviortrees” 这一行,纯粹出于审美目的。
  • 没有缓存return false 的模块,并且在每次require-调用时重新加载。
  • @siffiejoe 这实际上正是我想要的!万分感谢。如果不是评论,我会接受。

标签: lua dsl


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2021-08-15
    • 2019-10-04
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 2022-01-09
    • 2012-02-17
    • 2021-06-29
    • 1970-01-01
    相关资源
    最近更新 更多