まつもと ゆきひろです

In message "[ruby-dev:8259] Re: [ruby-list:18468] Re: Array doesn't include Comparable"
    on 99/11/07, ttate / jaist.ac.jp <ttate / jaist.ac.jp> writes:

|やっぱり(?)Enumerable#<=> があるのは何か変な気がしますし、メソッドと
|モジュール名を見た時にEnumerableとComparableの違いがなんかすっきりし
|ないです。

Enumerable#<=> ってメソッドは定義されてませんよ。

Enumerableはeachというメソッドを使って定義できる一連のメソッ
ドを加えるためのものです。

|Enumerableはeachをもとにしたメソッドのみを対象にすべきではないかと思
|います。で、Comparableは<=>をもとにしたメソッドのみで構成する方が使う
|ときにも単純ではないでしょうか?

そうなってますよ。ただ単に each を持つこと以上の期待をしてい
るのは sort, max, min で、これは「each の返す要素」が 
Comparable である(正確には <=> を定義している)ことを期待して
います。

これは一種の「過大な期待」であることは明らかですが、実用的な
ので妥協してます。

あと、かなりのメソッドが要素数が有限であることを仮定していま
す。これも過大な期待でないことは無いのですが、これはまあ妥当
ではないかと。

|具体的にはEnumerable#max,min,sortはComparableへ移った方がいいような気
|がします。

繰り返しになりますが、max, min, sortはComparable(<=>を定義し
ている)要素を含むEnumerableでだけ成立するメソッドです。単な
るComparableに対しては定義できません。

OrderedEnumerableというようなモジュールに分離するのは手かも
しれませんが、配列のような厳密にはorderedである保証はないが、
でもやっぱりソートしたいようなものもあるので、理論的きれいさ
を追求して分離することにそれほど意味があるようには思えません。

|で、Enumerable#first,lastがあると良いかなぁと、、、

で、first, lastはEnumerableでなく、Indexableの性質だと思いま
す。そういうモジュールは(まだ)ないんですが。Enumerable一般で
定義されて、すごく便利であれば、採用しないでもないですが。

                                まつもと ゆきひろ /:|)