Ruby脚本中的未初始化常量错误

Ruby脚本中的未初始化常量错误,ruby,require,Ruby,Require,我正在建模一个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

我正在建模一个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
require_relative "./common_page"
class PageA < CommonPage
  def pageA
    self
  end
end
require_relative "./common_page"
class PageB < CommonPage
  def pageB
    self
  end
end
文件
C:/Sandbox/pageA.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
require_relative "./common_page"
class PageA < CommonPage
  def pageA
    self
  end
end
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>'
C:/Sandbox/pageB.rb:2:in`':未初始化常量CommonPage(NameError)
来自C:/Sandbox/common_页面。rb:2:in'require_relative'
从C:/Sandbox/common_页面。rb:2:in`'
from C:/Sandbox/pageA.rb:1:in'require\u relative'
来自C:/Sandbox/pageA.rb:1:in`'
from C:/Sandbox/test.rb:1:in'require\u relative'
来自C:/Sandbox/test.rb:1:in`'

当我尝试创建其他类的实例时,也会弹出类似的错误。有人能解释一下这里发生了什么以及如何避免这个问题吗?

将公共页面中的require行移到该文件的底部


问题是,pageA需要公共页面,这需要pageA(已在进行中),继续使用公共页面需要pageB,后者又需要公共页面(已在进行中),然后继续引用尚未定义的公共页面。

将公共页面中的所需行移到该文件的底部


问题是pageA需要公共页面,这需要pageA(已在进行中),继续使用公共页面需要pageB,这反过来需要公共页面(已在进行中),然后继续引用尚未定义的公共页面。

显然,循环依赖性无法满足。若鸡蛋需要母鸡,而母鸡是从鸡蛋里孵化出来的,那个么若你们还并没有,你们就并没有了。为什么必须
common_page.rb
要求
pageA
?从
common_页面.rb
中删除requires,创建一个单独的
my_project.rb
,创建一个
my_project
目录,移动其中的所有其他文件,并从
my_project.rb
中删除requires,如下所示:

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'

显然,不能满足循环依赖性。若鸡蛋需要母鸡,而母鸡是从鸡蛋里孵化出来的,那个么若你们还并没有,你们就并没有了。为什么必须
common_page.rb
要求
pageA
?从
common_页面.rb
中删除requires,创建一个单独的
my_project.rb
,创建一个
my_project
目录,移动其中的所有其他文件,并从
my_project.rb
中删除requires,如下所示:

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'

这被称为“循环依赖”。@Sam感谢您的解释!循环引用是我在设计中应该避免的吗?有没有其他/更好的方法来实现我想要的?这就是所谓的“循环依赖”。@Sam谢谢你的解释!循环引用是我在设计中应该避免的吗?有没有其他/更好的方法来实现我的目标?