まつもと ゆきひろです

Ruby組み込みのNumericはComparableをincludeしていて、値がリニ
アに並ぶことを仮定しています。しかし、Complexは複素数ってく
らいですから一次元に並べることはできません。

現在は原点からの距離を使って大きさを比較する<=>を提供してお
茶を濁しているのですが、たとえばRangeの両辺に使うなどを考え
るとおかしなことになります。というか、Rangeは両辺が数(リニア
な数)の場合には範囲として動作させたいのですが、Complexのおか
げで

  kind_of?(Numeric)

が使えないことを気にしています。

この件についていくつか選択肢が考えられるのですが、私自身は実
際のプログラミングで複素数を使ったことがないので、どれがよい
のか判断できません。

  * Numericの下にInteger, Float, Rationalなどに共通のスーパー
    クラスを用意する。こちらにComparableをincludeする。名前
    はMagnitude ?

  * NumericにCompapableをincludeするのをやめて、Integer,
    Float, Rationalなどでそれぞれincludeする。しかし、これで
    どんな問題が解決するのかよくわからない。

  * ComplexをNumericのサブクラスにするのをやめる。coerceがあ
    るので動くはず。「ComplexはNumberだ」と言われると弱い。

  * Complexを比較するなんてのは例外的なことなので考えない(要
    するに現在のまま)。RangeはComplexに対して原点からの距離
    で比較するままで構わない。

ご意見を聴かせてください。

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