かんだです。

Re the message of ``[ruby-list:17674] Re: <=>''...

WATANABE Hirofumi <Hirofumi.Watanabe / jp.sony.com>:
> わたなべです.
> 
> そもそも初めて
>   a.to_i <=> b.to_i || a.to_i <=> b.to_s
> を見てすぐに意味がわかるかなあ?

  僕は qsort でも毎回確認するくらいなんで、ダメダメですな(^^;
  比較演算なら返り値は GREAT,EQUAL,LESS がいいなぁ。

  Comparable::GREAT = 1
  Comparable::EQUAL = 0
  Comparable::LESS  = -1

  || でつなげたいんなら、クラスを用意するか。

module Comparable;class Compare
  def initialize(v); @value = v; end

  def || (that)
    if @value != 0 then self else that end
  end

  end # of class Compare

  Great = Compare::new(1)
  Equal = Compare::new(0)
  Less  = Compare::new(-1)
end # of module Comparable

  意味的には、比較を真偽で表すなら、等しいかそうでないかでしょう。等しい
ときに false はちょっとイヤです。

  大小関係を表したいなら、現状 -1,0,1 か、または三値クラスを用意するのが
スマートだと思います。今も真偽値の為に Boolean があるわけだし。


  大小比較以外にも三つの値をとる演算ってありますかね? 具体的な問題は思い
出せませんが、たまに使いたくなった記憶はあるなぁ。頻出するならホントに採
用してもいいかもしれませんが。知能方面だと使いそうな気もちょっと。
  ただどんな演算を定義するのかよく分からないなぁ。当然 n値クラスはいらな
いの? という疑問も出てくるし(^^;


  ところで cascade 演算なら =>(矢印)なんてしっくりきそう。

  a.to_i <=> b.to_i => a.to_i <=> b.to_s

  やっぱり今イチかな…(^^;

> Wakou Aoyama <wakou / fsinet.or.jp> writes:
> 
> :[a.to_i, a.to_s, a.to_f] <=> [b.to_i, b.to_s, b.to_f]
> :
> :これも Array の機能を利用した応用技であり、そういう応用技が必要という
> :事は、元の仕様が不適切という事は明らかであると思います。
> 
> だから Ruby の場合はこうなんだでいいと思います.
> Perl よりよっぽどわかりやすいし.

  結局のところ、ぼくもこれでいいと思います。

  …もう一つ美的趣味言うと a,b と to_i,s,f を分けて書きたいなぁ。

  [a,b] => [:to_i, :to_s, :to_f]

  うーん。。。この場合のみに特化しすぎた美しさだな(^^;


> で Schwartzian Transform の話に続くわけで.

  この前の Perl 勉強会で初めて知りましたです。
  今度機会あれば使ってみようかと:-)


-- 
  だい@楓街           
    MAP2303 / mapletown.net                  紅玉軌道異変アリ。