From: Shin-ichiro HARA Date: 1999-08-16T23:45:54+09:00 Subject: [ruby-dev:7697] Re: [ruby-ext:00382] New coerce scheme 原です。 > 豊福@パパイヤです。 > で、どうなって欲しいかですが、思いつきの案を書きます。 > > (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案を合わせたようなものになっ > てます。 ただ、(ii) があれば (iii) はほとんど必要ないですよね。前に 必要になる例をあげていただいた覚えがありますが。 > 「左側からのop」をどう表現するのかとか、それがないとき > どう (左側からの一般的演算用処理)(op, other) に変換するのか > とかは全然考えてないです。 字句解析上可能かどうかわからないのですが、2項演算子の後ろ に ! を付けて反対にしたらどうでしょう。で、Numeric の様な基底ク ラスで +(other) の定義を other +! self にし、+!(other) の定義を a, b = other.coerce(self, :+!); b + a; みたいにしておきます。 サブクラスは、知らない相手に対する + や +! は super して、さら に coerce は再定義するという形で拡張していく訳です。