【问题标题】:Generate dependencies for Lua?为 Lua 生成依赖项?
【发布时间】:2016-07-20 01:52:53
【问题描述】:

我有一个 lua 项目,其中多个目录中指定的 lua 文件都在同一个根文件夹下,并带有一些依赖项。

有时我会遇到在加载时加载表时出现 nil 异常的问题,因为该表正在引用尚未初始化的表,例如:

Customer = 
{
     Type = CustomerTypes.Friendly
}

这会导致 CustomerTypes 出现 nil 异常,因为 CustomerTypes.lua 尚未加载。

我目前的解决方案是简单地在这些 lua 文件中调用全局函数来加载依赖脚本。

我想做的是预处理我的 lua 文件以查找所有依赖项,并在运行时按该顺序加载它们,而不需要在我的 lua 文件中调用函数或特殊语法来确定这一点(即预处理器将在程序上解决依赖关系)。

这是可以现实实现的吗?还有其他解决方案吗? (我遇到过一些,但不确定它们是否值得追求)。

【问题讨论】:

  • 作为替代方案,考虑将依赖项设计为与require 兼容,并通过require 调用(通常以@987654324 的形式)实际“声明”文件本身中每个文件的每个依赖项@ 一起靠近文件顶部)。

标签: lua dependencies preprocessor


【解决方案1】:

与 lua 一样,大约有 230891239122 种方法可以解决这个问题。我会在脑海中说出 3 个名字,但我敢打赌我至少可以画出 101 个插图并出版一本咖啡桌书。

首先,必须说这里的“依赖”概念完全取决于您的应用程序。 Lua对此毫无感觉。因此,这与克服 lua 的缺陷没什么两样,只是您在应用程序中创建了一个让您感到舒适的脚本环境,这就是 lua 的全部意义所在。

现在,在我看来,您似乎已经得出结论,需要预处理来解决给定的问题。我不认为这是有根据的。我觉得更传统的解决问题的方法是创建一个全局的 __newindex 元方法,通过引用最初从文件系统中扫描出来的脚本列表来处理“CustomerTypes 尚不存在”的情况,这让我感到有些自在。 987654321@ 并运行它。

但也许您有充分的理由希望它严格作为预处理完成。在您的情况下,我首先将“依赖项”视为在您的脚本文件系统中找到的脚本的任何名称。然后使用您刚刚创建的定义/列表扫描每个脚本以查找依赖项的名称,并为每个脚本添加 load(dependency) 命令。

由于“运行时”或“预处理”的概念在这种情况下有些模糊,您可能指的是脚本编译时。在发现 CustomerTypes 是合法的依赖名称后,您可以使用 LuaMacros 令牌过滤器系统来实现将 CustomerTypes 替换为 require("CustomerTypes.lua") 或类似效果的宏。

【讨论】:

    猜你喜欢
    • 2014-02-21
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-10
    • 2012-11-01
    • 1970-01-01
    • 2010-09-23
    相关资源
    最近更新 更多