From: Toyofuku Date: 1998-03-31T19:25:43+09:00 Subject: [ruby-dev:2006] Re: new coerce 豊福@パパイヤです。 けいじゅさん >> [新案2]では例えば Numeric * Matrix に対して >>(other', self', op') として >> (Matrixのself, Numericのother, :r_mul) >>を返し、r_mul は ... >>という感じになるんですね。 > > いや. 実はもっと楽になることに気づきました. Matrix#coerceを以下のよう > に定義します: > --> return Matrix.scalar(row_size, other), self, :* > こうすると, 右演算*(?)は必要なくなりますね. これはどの新案でも当てはま > りますね.  そうですね。 要素が左右可換なら return self, other, :* でもできるけど可換じゃない場合もあるなと思って matrix の matrix の掛け算を試したら require "matrix.rb" x = Matrix[[0, 1], [1, 0]] z = Matrix[[0, 0], [0, 0]] a = Matrix[[x, z], [z, x]] b = a * a の b[0, 0]を求める 0 + x * x + z * z の計算のところで 0 + Matrix がエラーになりました。 def +(other); other; end となるゼロオブジェクトなら いいのかな。 > ただし, この様な相互変換が可能なクラスというのは, それなりの密な関連の > あるクラス群(Calcurableは算術演算子で結ばれているクラス群)ではなくては > ならないので, このCalculatableはそういうクラス群がインクルードするモジュー > ルということになるんでしょうね.  次は「算術演算子で結ばれている」とはどういう意味か ということになりますね。 > そういう意味では, Stringが微妙なんだけど, これはcoerce呼んでいないのそ > れとも呼んでいる?  マニュアルによると coerce を持っているのは Numeric と Time となってました。 --- 豊福@パパイヤ unbound@papaya.juice.or.jp toyofuku@juice.or.jp