如何在一个模块内访问其他模块?

我在全局函数在模块中的应用上有些困惑。也许在这里有人能告诉我这个例子是否可以工作,为什么能工作,然后告诉我正确的做法。

如果我有两个模块:

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中loadfile()f1.lua?

点赞
用户2796594
用户2796594

这段代码只有在执行msgmod = ...后(在任何文件中)才会生效,而在此之前则不会。这是由于使用全局变量而造成的混乱情况。

通常情况下,您不应在模块中这样使用全局变量。您应该使用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()

请注意,我们可以省略第一行,因为我们在主文件中没有实际使用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
2018-08-22 22:33:49