为Lua生成依赖项?

时间:2016-07-20 01:52:54

标签: lua dependencies preprocessor

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

偶尔我遇到的问题是,在加载时加载表时,我得到一个nil异常,因为该表引用了一个尚未初始化的表,如:

Customer = 
{
     Type = CustomerTypes.Friendly
}

这导致CustomerTypes的零例外,因为尚未加载CustomerTypes.lua。

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

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

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

1 个答案:

答案 0 :(得分:2)

与lua一样,大约有230891239122种解决方法。我会把我的名字命名为3,但我敢打赌,我可以说明其中至少101个,并出版一本咖啡桌书。

首先,必须说“依赖”的概念完全取决于您的应用程序。 Lua没有意识到这一点。所以这不是克服lua中的缺陷,只是你在应用程序中创建一个让你感到舒服的脚本环境,这就是lua的全部内容。

现在,在我看来,你已经得出结论,需要预处理来解决给定的问题。我不认为这是有道理的。我觉得有点习惯说一个更传统的解决方法的方法是在全局制作一个__newindex元方法,它通过引用一个已经从文件系统中扫描出来的脚本列表来处理“CustomerTypes尚不存在”的情况。 {1}}然后运行它。

但也许你有充分的理由希望它完全像预处理那样完成。在您的情况下,我首先将'dependencies'视为脚本文件系统中找到的脚本的任何名称。然后使用刚刚创建的定义/列表扫描每个脚本以查找依赖项的名称,并在每个脚本前面添加CustomerTypes.lua命令。

由于“运行时”或“预处理”的概念在此上下文中有些含糊不清,因此您可能意味着在脚本编译时。您可以使用LuaMacros令牌过滤器系统来实现一个宏,在发现load(dependency)是合法的依赖项名称后,用CustomerTypesrequire("CustomerTypes.lua")取代CustomerTypes