在从多个外部 lua 文件中拆分和加载 lua 代码以及处理来自其他 lualatex 包的 lua 代码时,应遵循哪些最佳编码实践。这个想法浮现在我的脑海中,因为我现在有一堆可以加载和使用的 lua 文件,但这不是最干净地划分的代码。几个问题作为“旁注”提出这里下面重复得更清楚(和补充):
关于外部 lua 文件中“局部变量”的作用域和可能的名称冲突:在本文件的 linebreak.lua 中问题,局部变量的范围是什么
local n, head, last
?如果我用“require”加载另一个 lua 文件,并且该文件具有类似命名的局部变量,这会是个问题吗?lua 是否将局部变量保留在加载它的文件中的函数中?(即使我刚刚将它们加载到全局命名空间中)防止文件中的变量和函数与另一个文件中的变量和函数发生冲突/覆盖/干扰的最佳做法是什么?
记录他们添加到全局命名空间的内容是否是 lualatex 包开发人员文档指南的一部分? 如果 lualatex 包确实将名称写入全局命名空间,并且它与我的变量/函数名称冲突,那么开始调试的最佳位置是什么?
两个不同的 directlua/latelua 块之间的作用域是什么?据我观察,局部变量是 directlua 块的局部变量,过去我最终使用全局命名空间将值从一个 directlua 块“传递”到另一个。有没有更简洁的方法可以避免使用全局命名空间?
答案1
Lua 变量是定义它们的函数或作用域的本地变量。单独的源文件构成作用域,因此每个都require()
意味着变量是该文件的本地变量。对于\directlua
调用也是如此,但除了简单的应用程序之外,您应该使用一行加载 Lua 代码\directlua{require("myfile")}
。我认为需要更详细地说明您正在做什么,以便进一步评论“在\directlua
调用之间传递信息”。
通常,处理全局变量的最佳方法是声明一个表并将所有全局材料包含在其中。有几种方法,例如:
foo = foo or { }
foo.my_func = function(...)
end
或者
foo = foo or { }
local function my_func(...)
end
foo.my_func = foo.my_func or my_func
如果你愿意,你可以为全局表添加一个安全测试
if foo then
print("Oh no, someone has taken my table")
os.exit(1)
end
没有正式的文档/系统来处理全局命名空间。我建议您遵循与 TeX 宏相同的方法:根据您的包名称选择一个合理的名称。