【问题标题】:Uninitialized constant error in Ruby scriptsRuby 脚本中的未初始化常量错误
【发布时间】:2013-04-27 14:05:17
【问题描述】:

我正在为一个 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>'

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

【问题讨论】:

    标签: ruby require


    【解决方案1】:

    显然,不能满足循环依赖。如果鸡蛋需要母鸡,而母鸡是从鸡蛋中孵化出来的,那么如果你还没有,你就没有。为什么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'
    

    【讨论】:

      【解决方案2】:

      将 common_page 中的 require 行移动到该文件的底部。

      问题是pageA需要common_page,它需要pageA(已经在进行中),common_page需要pageB,而pageB又需要common_page(已经在进行中),然后继续引用尚未定义的CommonPage。

      【讨论】:

      • 这被称为“循环依赖”。
      • @Sam 感谢您的解释!我在设计中应该避免循环引用吗?是否有另一种/更好的方法来实现我想要的?
      猜你喜欢
      • 1970-01-01
      • 2011-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多