2016-04-29 72 views
2

顯然,我在ruby中的理解方式有些問題。我有3個紅寶石文件主,基地,並派生。我有兩個班Derived專門從Base帶類繼承的未初始化常量錯誤

/bin/main.rb

require './lib/base' 

/lib/base.rb

require './lib/derived' 
class Base 

end 

/lib/derived.rb

require './lib/base' 
class Derived < Base 

end 

與耙運行ruby './bin/main.rb'

`<top (required)>': uninitialized constant Base (NameError) 

什麼是造成錯誤?

編輯: 我剛剛意識到我缺少的一點是我忘了require是一個內核#方法,我不需要像我通常對其他語言一樣每次都保持在我的代碼之上。

+1

您正在從'base'的'derived'和'derived'需要'base'。這是一個無限循環。 –

+0

@Petr,我知道這個錯誤就是這樣,謝謝你的確認。 –

回答

2

這裏的問題是,需要'./lib/derived'/lib/base.rb文件實際上是造成/lib/derived.rb之前Base/lib/base.rb被宣告解析。試試這個,而是:

/bin/main.rb

require './lib/base' 
require './lib/derived' 

puts 'Success!' 

/lib/base.rb

class Base 

end 

/lib/derived.rb

require './lib/base' 
class Derived < Base 

end 

這使得聲明以正確的順序發生。

作爲一個側面說明,它不是在技術上lib/main.rb必要require './lib/base',因爲它實際上是成功列入lib/derived.rb,但如果Base中的lib/main.rb體內直接使用的好形式。

+0

謝謝,現在它是有道理的,雖然我希望只需要基類中的子類使它像一個工廠一樣,隱藏客戶端的子類細節(main.rb)。 –

+0

你可以通過幾種不同的方式來實現。首先,您可以使用加載程序文件來要求您的項目的所有依賴項,這是大多數框架完成的工作。在這個簡單的例子中,你可以合理地跳過''lib/derived.rb''文件,並在''lib/base.rb''中聲明'Base'和'Derived'類,更像一個庫做到這一點。如果你必須有單獨的源文件,在你完成「Base」聲明之後,只需要從'lib/base.rb''的底部''lib/derived.rb''。 –