2013-04-22 115 views
3

尋找一個有趣的Ruby觀察的解釋。考慮可比模塊中混合如下:在Ruby中包含與擴展和可比較模塊

class Class0 
end 
class Class1 
    include Comparable 
end 
class Class2 
    extend Comparable 
end 

如果我們尋找這是在Class2中主場迎戰Class0方法,

Class2.methods.each { |x| p x if not Class0.methods.include? x } 

我們得到的只是:之間?

不過呢,如果我們做到這一點,尋找的Class1和Class0的實例之間的差別,

a = Class0.new 
b = Class1.new 
b.methods.each { |x| p x if not a.methods.include? x } 

我們得到

[:>, :>=, :<, :<=, :between?] 

我想知道爲什麼結果不同。我希望「擴展」能夠將相同的方法推入類中,使「包含」進入實例。 像「:>」這樣的東西與「:之間? ??

回答

3

包括爲添加方法的類的一個實例,並延伸爲加入類方法: http://www.railstips.org/blog/archives/2009/05/15/include-vs-extend-in-ruby/

兩者:>和:是之間的方法。 區別在這裏:

如果您看到Class0方法,您有:>,:> =,:<,:< =定義爲類方法。 當Class2擴展Comparable時,它會得到?方法作爲類方法。

在第二種情況下,您有Class0和Class1實例,因此Class0的一個實例沒有:>,:> =,:<,:< =,:之間?方法定義爲實例方法。一旦在Class1中包含可比較的模塊,它將從Module獲取所有這些方法作爲實例方法,因此您將在實例中提供所有[:>,:> =,::<,::< =,:灣

這就是爲什麼你會得到這些結果。

我發現了包括VS擴展這裏的另一個很好的解釋: http://aaronlasseigne.com/2012/01/17/explaining-include-and-extend/

+0

謝謝,@tbem,但不回答這個問題。問題是,爲什麼他們似乎做了不同的事情,一個到了班級,另一個到了一個實例?爲什麼他們應該添加不同的方法? – sploiber 2013-04-22 21:07:00

+0

我用更好的解釋編輯了我的答案...... – tbem 2013-04-23 10:56:41

+0

@sploiber你明白了嗎? – tbem 2013-04-24 11:27:04