为 Lua 生成依赖关系?

我有一个 Lua 项目,其中 Lua 文件指定在同一根文件夹下的多个目录中,具有一些依赖关系。

偶尔我会遇到问题,当在加载时加载表时,我会得到 nil 异常,因为该表正在引用未初始化的表,例如:

Customer =
{
     Type = CustomerTypes.Friendly
}

这会导致 CustomerTypes 作为 CustomerTypes.lua 尚未加载的 nil 异常。

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

我想做的是预处理我的 Lua 文件以找到所有依赖关系,并在运行时按照那个顺序加载它们,而无需在我的 Lua 文件中使用函数调用或特殊语法来确定这一点(即,预处理器将过程化地处理依赖关系)。

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

点赞
用户4253427
用户4253427

通常情况下,使用lua解决问题有数不清的方式。我可以想到3种,但我敢打赌我可以说明其中至少101种并出版一本咖啡桌书。

首先,必须指出,这里的“依赖关系”概念严格取决于您的应用程序。Lua没有这种感觉。因此,这并不像是克服lua中的缺陷,而是您在应用程序中创建一个脚本环境,使您感到舒适,而这就是lua所关注的。

现在,我认为您已经得出了一个结论,即需要预处理才能解决给定的问题。我不认为这是必要的。我感觉更传统的解决问题的方法是全局地创建一个__newindex元方法,通过引用最初从文件系统中扫描出的脚本列表来处理“CustomerTypes不存在”的情况,并运行该脚本。

但也许您有一些想要以严格的预处理方式完成的好理由。在您的情况下,我会将“依赖项”视为您的脚本文件系统中的任何名称。然后,通过使用刚刚创建的定义/列表来扫描每个脚本以查找依赖项的名称,并在每个脚本之前添加load(dependency)命令。

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

2016-07-20 07:05:55