I am a newbie and learning ruby. Would like to have a better understanding of the question asked. I don't understand the use of comparable mixin and enumerable mixin. I mean we don't include these in our class when we need to use them, right? if we want to compare two objects we simply write x > y. Then what is the use of explicitly using them?
2 に答える
素晴らしい質問Akash!
2つのオブジェクトを比較する方法が「単純」でない場合があります。犬のクラスがある場合はどうなりますか?2つのDogインスタンスをどのように比較しますか?何に基づいて比較する必要がありますか?彼らの名前を比較するだけで十分ですか?彼らの品種?彼らのDNA?それは本当にあなた次第です。そして、それは、モデルにComparableを含め、2つの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 }
これらの両方のミックスインのポイントは、1つのメソッドを自分で実装するだけで、たくさんのメソッドを提供できることです。
ミックスインがないComparable
場合は、、、、をクラスで定義する必要がありますが、含める場合は、>
を定義するだけで済みます。メソッドに基づいた、これらの他のメソッドの実装が含まれています。<
>=
<=
==
Comparable
<=>
Comparable
<=>
同様に、列挙可能の場合は、定義するだけで、、、、などを取得each
できます。map
inject
partition
reject