From: keiju@... (Keiju ISHITSUKA) Date: 1998-03-30T15:32:34+09:00 Subject: [ruby-dev:1990] Re: new coerce けいじゅ@日本ラショナルソフトウェアです. In [ruby-dev :1982 ] the message: "[ruby-dev:1982] Re: new coerce ", on Mar/30 03:03(JST) toyofuku@juice.or.jp writes: > 豊福@パパイヤです。 >> 1. MatrixにおけるScalarの様な間接クラスは必要なくなる(と思う). > > [新案2]では例えば Numeric * Matrix に対して >(other', self', op') として > (Matrixのself, Numericのother, :r_mul) >を返し、r_mul は > class Matrix > def r_mul(other) > case other > when Numeric > return self.collect{|e| other * e} > ... > end > end > end >という感じになるんですね。 いや. 実はもっと楽になることに気づきました. Matrix#coerceを以下のよう に定義します: class Matrix def coerce(other, meth) case meth when :+ case other when Numeric エラー ... end when :* case other when Numeric --> return Matrix.scalar(row_size, other), self, :* ... end ... end end end こうすると, 右演算*(?)は必要なくなりますね. これはどの新案でも当てはま りますね. 多分, 右演算が必要になるのは**だけでしょう. Matrix ** num と num ** Matrix は本質的に違いますからね. # ますます, 新案が気に入ってきました(^^;;; >まつもとさん >> この場合 Calculatable ってのが妥当なモジュール名なんですか? > > これらを見て思い出したんですが、最初の頃 > >・計算ぽくない二項メソッド(引数が一個のメソッド > のつもり)でも coerce を使いたいことはないのだ > ろうか。数学っぽい計算だけ特別なのか? >・もし計算ぽくない二項メソッドでも coerce を考え > るとしたら、一般のメソッドでは? 二項だけ特別な > のか? そういう場合もないとはいえませんよね. ただし, この様な相互変換が可能なクラスというのは, それなりの密な関連の あるクラス群(Calcurableは算術演算子で結ばれているクラス群)ではなくては ならないので, このCalculatableはそういうクラス群がインクルードするモジュー ルということになるんでしょうね. そういう意味では, Stringが微妙なんだけど, これはcoerce呼んでいないのそ れとも呼んでいる? 新案2ではこの辺が気になっていないでもない. __ ................................石塚 圭樹@日本ラショナルソフトェア... ----------------------------------->> e-mail: keiju@rational.com <<---