在尝试执行循环要求时,如何避免Lua 5.1出现以下错误?
$ lua main.lua
lua: ./bar.lua:1: loop or previous error loading module 'foo'
stack traceback:
[C]: in function 'require'
./bar.lua:1: in main chunk
[C]: in function 'require'
./foo.lua:1: in main chunk
[C]: in function 'require'
main.lua:1: in main chunk
[C]: ?
main.lua
require "foo"
require "bar"
print (Foo.getName())
print (Bar.getName())
foo.lua
require 'bar'
Foo = {}
Foo.name = 'foo'
function Foo:getName()
return Foo.name .. Bar.name
end
bar.lua
require 'foo'
Bar = {}
Bar.name = 'bar'
function Bar:getName()
return Bar.name .. Foo.name
end
$ lua main.lua
foobar
barfoo
答案 0 :(得分:12)
解决此问题的另一种方法是更改代码的结构并将“相互”功能提取到第三个模块中,Foo
和Bar
都需要这些模块。
答案 1 :(得分:10)
<强> main.lua 强>
Foo = Foo or require "foo"
Bar = Bar or require "bar"
print (Foo.getName())
print (Bar.getName())
<强> foo.lua 强>
Foo = {}
Bar = Bar or require "bar"
Foo.name = 'foo'
function Foo:getName()
return Foo.name .. Bar.name
end
return Foo
<强> bar.lua 强>
Bar = {}
Foo = Foo or require "foo"
Bar.name = 'bar'
function Bar:getName()
return Bar.name .. Foo.name
end
return Bar
由于您正在设置全局变量,因此在尝试其他需求之前,您可以检查该文件是否已被要求(也称为已定义的全局变量):
Bar = Bar or require "bar"
您的bar.lua
必须返回Bar的定义;
Bar = {}
-- ...
return Bar
这不会完全解决问题,因为bar.lua
期望定义Foo
。要解决此问题,您可以定义具有相同名称的虚拟变量:
Foo = {}
Bar = Bar or require "bar"
这是唯一可能的,因为您在调用函数时将Foo
的使用推迟到了。如果您想在Foo.name
范围内调用bar.lua
,您最终会遇到相同的循环依赖问题。