In article <877kc4li11.fsf / serein.a02.aist.go.jp>,
  Tanaka Akira <akr / m17n.org> writes:

> String と Exception には順序関係は存在しないと考えるのが自然だと思うの
> で、<=> は nil か例外になるべきだという趣旨です。
>
> というわけで、
>
>> あと、現在、Comparableで定義されている比較演算子が比較が成立
>> しない場合に偽を返すのは仕様のつもりです。この仕様が(対称性
>> の観点から)妥当でないのではないかという議論は歓迎します。
>
> というほうに対する反応はかなり適当だったのですが、もうすこし真面目に考
> えました。
>
> 私としては、nil を推します。

えーと、結構前の話ですが、この、比較が成立しない場合に <=>, <, <=, >, >=
が nil を返すほうがいい、というのを撤回します。

まぁ、現在の実装は <, <=, >, >= に関しては nil じゃなくて例外になるの
でいいんですが、<=> の返り値は nil という流儀になっているので、このメー
ルではそこに文句をつけます。端的にいえば、そこは nil と例外を使い分け
るべきだ、というのが主旨です。

これは昨日のモジュールの比較とも関連するのですが、比較が成立しないとい
うのはふたつのケースがあります。モジュールの例でいえば、モジュールとモ
ジュールを比較したんだけど親子関係になかったという場合と、モジュールと
モジュール以外のものを比較したという場合です。前者では比較が成立しない
というのは、(ユーザは順序が決まらないかもしれないとわかっていますから)
等しい、大きい、小さい、というのと同じレベルの情報です。したがって、
nil が適切でしょう。しかし、後者はなんの意味もないわけで、おそらくバグ
です。したがって例外が適切でしょう。

一般にいえば、Ruby のオブジェクト全部の中で、比較されることが想定され
てるオブジェクト群があるとすると、そのオブジェクト群の中での半順序関係
で順序がつかなかった場合と、そのオブジェクト群内のオブジェクトとそれに
属していないオブジェクトを比較した場合のふたつがあって、前者は nil が、
後者は例外が適切だろう、というわけです。

この考え方でいけば、半順序関係になるのは組み込みの中ではモジュールしか
ないので、それ以外は全部例外が適切ということになります。

また、そういうオブジェクト群とはなにかというと、数直線にのるようなオブ
ジェクト (Fixnum, Bignum, Float)、文字列 (String, to_str と <=> が適切
に定義されているもの)、配列 (Array, to_str と <=> が適切に定義されてい
るもの) などあります。

現在はそれ以外のクラスは単独のクラス内でしか比較に意味がないように思う
んですが、File::Stat の <=> は mtime の比較なので、Time と比較できても
いいかも知れません。

とゆーわけで、いったん nil に変わったのを戻すようでなんですが、また例
外にするのはどうでしょうか。

# そういえば、comp.lang.python ではどんな議論がされてたんですか?
-- 
[田中 哲][たなか あきら][Tanaka Akira]