如何访问模块中的其他模块?

时间:2018-08-22 19:07:06

标签: module lua

我在与模块相关的函数的“全局”方面苦苦挣扎。也许有人可以告诉我这个例子是否可行,解释原因,然后告诉我正确的方法。

如果我有两个模块:

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?

1 个答案:

答案 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