2012-07-31 53 views
4

我是新手和學習ruby。希望對問題有更好的理解。我不明白使用可比較的mixin和可枚舉的mixin。我的意思是,當我們需要使用它們時,我們不會在課堂上包括這些,對吧?如果我們想比較兩個對象,我們簡單地寫x> y。那麼明確使用它們有什麼用?理解可比較的mixin和可枚舉mixin

回答

5

這兩個mixin的要點是它們給你一大堆方法,而你只需要自己實現一個方法。

沒有你要定義><>=,在你的類<===,而如果包括Comparable你只需要定義<=>Comparable混入。 Comparable包含那些其他方法的實現,基於您的<=>方法。

同樣用枚舉,你只需要定義each,作爲回報,你會得到mapinjectpartitionreject等等

+0

或者像弗雷德所說的那樣簡潔 – 2012-07-31 12:12:46

+0

謝謝弗雷德,很好的解釋。我相信我現在瞭解得更多,並對這個主題有了清晰的認識。我希望我能夠在我的項目中明智地實施它。 – 2012-07-31 13:03:07

6

大問題阿卡什!

有時並不是「簡單」的兩個對象如何比較!如果你有一堂狗課?你如何比較兩個Dog實例?基於什麼應該是比較?比較他們的名字就足夠了嗎?他們的品種?他們的DNA?這真的取決於你。那就是當你可以在你的模型中包含Comparable並且實現你自己所需的最小函數來定義使兩個Dog實例相同的原因。你定義了比較。一旦你在你的模塊中定義了< =>比較器,那麼你的對象可以進行比較以得到相等的結果,或者進行排序或排序,因爲ruby會知道如何比較一個實例和另一個實例。

同樣,包含Enumerable模塊允許您的類能夠遍歷其實例的集合。一旦你在你的類中實現了每個方法,你就可以在你的類中使用整個Enumerable模塊的方法。諸如map/collect之類的方法可以在你的課堂上使用。

class Dog 
    include Enumerable 

    attr_accessor :puppies, :name 

    def initialize(name) 
    @name = name 
    @puppies = [] 
    end 

    def each(&block) 
    @puppies.each do |puppy| 
     puts "yielding #{puppy}" 
     yield(puppy) 
     puts "just yielded #{puppy}" 
    end 
    end 

end 


tommy = Dog.new("tommy") 
tommy.puppies = ["julie","moti","husky"] 

tommy.each do |p| 
    puts p 
end 

big_puppies = tommy.map{|x| x.titleize } 
+0

現在我明白了更多。非常感謝你的寶貴時間。這個解釋幫助了我很多。 – 2012-07-31 13:03:26