豊福@パパイヤです。 けいじゅさん > 確かに, obj1 + obj2 と obj1 ** obj2 が違う型に変換したいことはあるかも > 知れません. > obj1のクラスをC1, obj2のくらすをC2とします. > C1が新規型の場合は問題ないですね. C1#+, C1#** の側で対処すれば良いので > すから, 問題はC1がIntegerなどの既存型の場合です. class Fixnum alias plus_exept_for_matrix + def +(other) case other when Matrix エラー else rerun self.plus_exept_for_matrix(other) end end end というのはできませんか。 新しい型を増やすたびに alias が増えていきますが。 > C1が新規型の場合は問題ないですね. C1#+, C1#** の側で対処すれば良いので すべての新規クラスを考慮して秩序だって作っていける ならよいですが C1 と C2 をどんどん別の人が独立に作って いくような場合、C1 + C2 という新たな組合せを後から後 から追加していかなければならないという問題はないですか。 > その場合は, エレガントな解決ではないのですが, 以下のようにしますと大体 > うまくいくと思います. まず, 新しい型C3をつくります. ... > と適当な演算を定義します. なるほど。 > ただ, 問題は, 数システムに融合させるために定義するべきメソッドが多くて > 基本的にタイプスイッチを行なわなくてはならなくて既存クラスとの兼ね合い > をいろいろ考えなくてはならないってことですかね. 上の方法でも新しい型を作って実質そこにすべてまか せているようにバラエティあふれる演算に対して引数が other だけの coerce に協力させるのはきびしいような 気がするのですが。 > 逆にSmalltalkだとこの > 辺り楽なんですが... coerce という機構は ruby で初めて知ったのですが Smalltalk ではここらへんどういう態度をとっているの でしょうか。 > ex. Matrix#- > > def -(m) > case m > when Numeric > Matrix.fail ErrOperationNotDefined, "-" > when Vector > m = Matrix.column_vector(m) > when Matrix > else > x, y = m.coerce(self) > return x - y > end > > Matrix.fail ErrDimensionMismatch unless row_size == m.row_size and column_size == m.column_size case m に else があるのでこの Matrix.fail の行には 来ないような気がするのですが違ってます? --- 豊福@パパイヤ unbound / papaya.juice.or.jp toyofuku / juice.or.jp