2013-04-27 94 views
1

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

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

回答

3

很明显,无法满足循环依赖。如果鸡蛋需要鸡蛋,而鸡蛋则需要鸡蛋,如果你还没有鸡蛋,你就没有鸡蛋。为什么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' 
3

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

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

+3

这被称为“循环依赖”。 – 2013-04-27 14:48:31

+0

@Sam谢谢你的解释! 在我的设计中,我应该避免循环参考吗?是否有另一种/更好的方式来实现我想要的? – tom 2013-04-27 15:37:55

相关问题