2013-04-27 99 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

相關問題