Ruby脚本中未初始化的常量错误
问题描述:
我正在建模一个Web应用程序,您可以通过单击某个链接进入另一个应用程序页面。我决定做这样的事情:Ruby脚本中未初始化的常量错误
文件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
文件:
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>'
类似的错误还弹出,当我尝试创建其他类的实例。有人可以解释这里发生了什么,以及如何避免这个问题?
答
很明显,无法满足循环依赖。如果鸡蛋需要鸡蛋,而鸡蛋则需要鸡蛋,如果你还没有鸡蛋,你就没有鸡蛋。为什么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'
答
将common_page中的require行移动到该文件的底部。
问题是,pageA需要common_page,它需要pageA(已在进行中),继续common_page需要pageB,而pageB又需要common_page(已在进行中),然后继续引用尚未定义的CommonPage 。
这被称为“循环依赖”。 – 2013-04-27 14:48:31
@Sam谢谢你的解释! 在我的设计中,我应该避免循环参考吗?是否有另一种/更好的方式来实现我想要的? – tom 2013-04-27 15:37:55