我在与模块相关的函数的“全局”方面苦苦挣扎。也许有人可以告诉我这个例子是否可行,解释原因,然后告诉我正确的方法。
如果我有两个模块:
f1.lua
local mod = T{}
function mod.print_msg(msg)
print(msg)
end
return mod
f2.lua
local mod = T{}
function mod.print_hello()
msgmod.print_msg('Hello')
end
return mod
都被称为“主”文件
msgmod = assert(loadfile(file_path .. 'f1.lua'))()
himod = assert(loadfile(file_path .. 'f2.lua'))()
himod.print_hello()
如果从f2调用print_hello仍然可以工作,还是我需要在f2中加载file()f1.lua?
答案 0 :(得分:1)
如果在执行msgmod = ...
之后(在 any 文件中)调用,但不会在之前调用,它将起作用。由于使用了全局变量,这是一个令人困惑的情况。
通常,您不想在模块中使用像这样的全局变量。您应该使用require
处理依赖关系,就像在C ++中#include
处理依赖关系一样。因此,想要使用f1.lua中定义的print_msg
的f2.lua可能看起来像这样:
local f1 = require('f1')
local mod = T{}
function mod.print_hello()
f1.print_msg('Hello')
end
return mod
您还应该在主文件中使用require
(并养成将所有内容都本地化的习惯):
local msgmod = require('f1')
local himod = require('f2')
himod.print_hello()
请注意,由于我们实际上并未在main中使用f1,因此我们可以省略第一行,而当我们需要f2时,f2将自动需要它。与loadfile
不同,require
自动缓存已加载的模块,以便它们仅被加载一次。同样,require
几乎总是您要使用的。
编写模块的一般模式是要求将所有依赖模块都放入本地,然后根据需要使用它们来实现模块功能:
local dep1 = require('dep1')
local dep2 = require('dep2')
...
local mod = {}
function mod.foo ()
return dep1.bar(dep2.bazz())
end
return mod