我正在为一个Web应用程序建模,您可以通过单击某个链接访问另一个应用程序页面。我决定做这样的事情:
档案C:/Sandbox/common_page.rb
:
require_relative "./pageA"
require_relative "./pageB"
require_relative "./pageC"
require_relative "./pageD"
class CommonPage
def pageA
# click_pageA_link
pageA.new
end
def pageB
# click_pageB_link
pageB.new
end
def pageC
# click_pageC_link
pageC.new
end
def pageD
# click_pageD_link
pageD.new
end
# and so on for other pages..
end
档案C:/Sandbox/pageA.rb
:
require_relative "./common_page"
class PageA < CommonPage
def pageA
self
end
end
档案C:/Sandbox/pageB.rb
:
require_relative "./common_page"
class PageB < CommonPage
def pageB
self
end
end
将为代表其他页面的类提供类似的代码。如果我使用以下代码运行文件C:/Sandbox/test.rb
:
require_relative "./pageA"
pA = PageA.new
我收到此错误:
C:/Sandbox/pageB.rb:2:in `<top (required)>': uninitialized constant CommonPage (NameError)
from C:/Sandbox/common_page.rb:2:in `require_relative'
from C:/Sandbox/common_page.rb:2:in `<top (required)>'
from C:/Sandbox/pageA.rb:1:in `require_relative'
from C:/Sandbox/pageA.rb:1:in `<top (required)>'
from C:/Sandbox/test.rb:1:in `require_relative'
from C:/Sandbox/test.rb:1:in `<main>'
当我尝试创建其他类的实例时,也会弹出类似的错误。有人可以解释这里发生了什么,以及如何避免这个问题?
答案 0 :(得分:4)
显然,无法满足循环依赖。如果鸡蛋需要母鸡,母鸡孵出一个鸡蛋,那么如果你还没有,那么你没有。为什么common_page.rb
必须pageA
?从common_page.rb
删除要求,单独创建my_project.rb
,创建my_project
目录,移动其中的所有其他文件,并从my_project.rb
中按要求提供,如下所示:
require_relative 'my_project/common_page'
require_relative 'my_project/pageA'
require_relative 'my_project/pageB'
require_relative 'my_project/pageC'
require_relative 'my_project/pageD'
答案 1 :(得分:3)
将common_page中的require行移动到该文件的底部。
问题是pageA需要common_page,这需要pageA(已在进行中),在common_page上继续需要pageB,而pageB又需要common_page(已在进行中),然后继续引用尚未定义的CommonPage。