From: toyofuku@... Date: 1999-08-16T20:55:26+09:00 Subject: [ruby-dev:7694] Re: [ruby-ext:00382] New coerce scheme 豊福@パパイヤです。 整理もかねて coerce の何がひっかかっているのか考えて みました。 coerce は 「クラスAのオブジェクトaとクラスBのオブジェクトbの演算 a op b をA側で計算できないとき クラスA'のオブジェクトa'とクラスB'のオブジェクトb'が存在して a' op b' の値として計算できる。ここで A',B' は既知のクラスか B または Bとともに提供されるクラスで、 (1) A',B' は A と B にのみ依存し op には依存しない」 ということを基にして作られています。 a op b は B側から見ると b.(左側からのop)(a) のように見えます。 b.(左側からの+)(a) b.(左側からの*)(a) などいろいろありますが、大筋の処理は「op には依存しない」 と考えて、すべての左側からの演算の窓口を一つにしたものが b.coerce(a) に対応していると思います。ただし (2) 最後の計算 a' op b' は必ずクラスA'側でやる ことになってますから(仮にB側で最後まで計算した方が話が 早そうだとしても)b.coerce(a) はその直前までをお膳立て することになります。 原さんの > |class 数値関連クラス > で、+(other) と coerce(other) では、とても似たことをしてますよね。 というのも +(other) と (左側からの+)(other) の類似から 来ているのだと思います。 B が Complex のときまでは (1)(2) とも自然に実現されて ますが、Matrix では (1)(2) を満たすために A' として class Scaler を強引に提供しているように感じます。 で、どうなって欲しいかですが、思いつきの案を書きます。 (i) A は a op b が計算できないときは b.(左側からのop)(a) として B に完全に任す。 (ii) B に def (左側からのop)(other) が定義されていればそのメソッドで処理される。 (iii) それがないときは def 左側からの一般的演算用処理(op, other) のメソッドで処理される。 (このメソッドが従来の coerce に対応し self と other から a' と b'を計算して a' op b' で結果を出したりする) これは以前石塚さんの説明にあった左側からの演算用メソッド の話と、引数にopを含む新coerce案を合わせたようなものになっ てます。 「左側からのop」をどう表現するのかとか、それがないとき どう (左側からの一般的演算用処理)(op, other) に変換するのか とかは全然考えてないです。 --- 豊福@パパイヤ unbound@papaya.juice.or.jp toyofuku@juice.or.jp