In message <19991014155954A.tadf / kt.rim.or.jp>
tadf / kt.rim.or.jp writes:

> wakou> このあたりは難しいですよね。だいたい、-1, 1 もこれが適切とは言いきれま
> wakou> せんし。しかしとりあえず、
> 
> そういっちゃうと、なんでも言いきれないような気がするんですが、具体的に
> どうすればいいのでしょう。

Comparable にでも定数 Less,Greater,Equal を定義して,これを使う.定
数 Less,Greater,Equal のクラスは.... ま,適当に.

# 必要なら LessEqual,GreaterEqual も定義する.

....冗談はおいといて,と (^^;


> wakou> ((a.to_i <=> b.to_i).nonzero? || a.to_s <=> b.to_s).nonzero? ||
> wakou>  a.to_f <=> b.to_f
> wakou> やはりこれはちょっと美しくないですし、
> 
> これはそう思います。
> 
> ただ、これは、ずらずら並べれば、どうやっても、美しくなりようがないでしょ
> う。しかも、対象の数があらかじめ判っていて、その数が少ないときでないと
> つかえないと思います。

「あるものとみなして比較,同一であったなら更に別の物とみなして比較....」
という事ですよね.で,

    1. Fixnum,Integer,Rational,Complex あたりなら値がとり得る最大値
       域のクラスに変換してから比較.

    2. そもそも全然別の物(例の数値と文字列など)であるなら比較前に形
       から比較のために変換する先の型を決める.

    # まとめて
    #
    # case a+b
    # when /([+-]\d*\.?\d+(?:[eE][+-]?\d+)?)\1/
    #   a.to_f <=> b.to_f
    # else
    #   a <=> b
    # end
    # 
    # とか.... そういえば二つの値で,っていうのはやった事なかったな.

という事を考えるのですが,それで大きな問題が起こる場合ってあるでしょう
か.

# 具体例を思い付かないのはあんまり複雑なプログラム書かないからかな?


> wakou> [a.to_i, a.to_s, a.to_f] <=> [b.to_i, b.to_s, b.to_f]
> 
> wakou> これも Array の機能を利用した応用技であり、そういう応用技が必要という
> wakou> 事は、元の仕様が不適切という事は明らかであると思います。
> 
> 僕はそうでもないと思います。

そうですよね.`<=>' という三種類(あるいは比較不能を含めて四種類)の結
果を返す演算子で,「等しい」を意味するのが「nil/false」である,という
仕様はあまりにも直観的でないと思います.

# 「比較不能」のためにとっといてくれ,と.


Array の比較が「要素の順序による一種の辞書順」であるのは十分に直観的だ
と思うし,それを利用するのが不適切であるとはあまり思えません.

# 多分自分なら,先に書いたように比較前に分岐させますし.


-- 
柳川和久 @ 東大阪市 . 大阪府                               October 14, 1999
Art is long, and time is fleeting.