我正在对一个 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
Run Code Online (Sandbox Code Playgroud)
文件C:/Sandbox/pageA.rb:
require_relative "./common_page"
class PageA < CommonPage
def pageA
self
end
end
Run Code Online (Sandbox Code Playgroud)
文件C:/Sandbox/pageB.rb:
require_relative "./common_page"
class PageB < CommonPage
def pageB
self
end
end
Run Code Online (Sandbox Code Playgroud)
对于表示其他页面的类,将提供类似的代码。如果我C:/Sandbox/test.rb使用以下代码运行文件:
require_relative "./pageA"
pA = PageA.new
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
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>'
Run Code Online (Sandbox Code Playgroud)
当我尝试创建其他类的实例时,也会弹出类似的错误。有人可以解释一下这里发生了什么以及如何避免这个问题吗?
显然,循环依赖是无法满足的。如果鸡蛋需要母鸡,而母鸡是从鸡蛋中孵化出来的,那么如果你还没有,那么你就没有。为什么一定要common_page.rb要求pageA?从 中删除 require common_page.rb,创建一个单独的my_project.rb,创建一个my_project目录,移动其中的所有其他文件,然后从my_project.rb以下 require 它们:
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'
Run Code Online (Sandbox Code Playgroud)