2014-12-02 95 views
1

我想知道這樣的事情是否可能在紅寶石中。紅寶石類的遺體繼承

# file a.rb 
class A 
    puts self 
end 

# file b.rb 
require 'a' 
class B < A; end 

# file run.rb 
puts 'start' 
require 'a' 
puts 'between' 
require 'b' 
puts 'end' 

# expected output 
$ ruby run.rb 
# => start 
# => A 
# => between 
# => B 
# => end 

# what i've got 
# => start 
# => A 
# => between 
# => end 

我希望在需要時將類保持不變。但我想實現這一次,然後在兒童班重複這一點,而無需觸摸代碼。

+0

據我瞭解你的問題,這是'require'的默認行爲。你有沒有嘗試運行你的代碼? – 2014-12-02 14:06:44

+0

首先,我正在玩irb,但現在我試圖用單獨的文件運行它,但仍然不能按我的想法運行。 我在運行類的輸出中增加了一些調試功能,我得到了這個結果:'#=> start#=> A#=>#=> end' 應該有'#=> B' #=>結束'打印。 – SZMER 2014-12-02 14:12:52

回答

5

它不輸出B,因爲已經評估了包含puts self的A類塊。當從類繼承它時,它不會重新評估類A的主體。

在廣泛的筆畫中,您可以將Ruby類看作是從中查找方法的散列數組。當您繼承一個類時,您會在查找列表中推送新的方法散列。

話雖這麼說,在Class#inherited功能將允許你這樣做,你在尋找什麼:

class A 
    def self.inherited(klass) 
    puts klass 
    end 
end 

class B < A 
end 

另請注意模塊有兩個相關的方法:Module#includedModule#extended

+0

如果你想要這個功能,但具有舊的繼承行爲,你可以在覆蓋'inherited':'alias_method:old_inherited,:inherited'之前在'class A'中設置一個別名方法。然後,'put klass'後,你可以調用'old_inherited'。 – aceofbassgreg 2014-12-02 19:16:24