From: Shin-ichiro Hara Date: 1999-08-18T09:16:44+09:00 Subject: [ruby-dev:7710] Re: [ruby-ext:00382] New coerce scheme 原です。 In message "[ruby-dev:7706] Re: [ruby-ext:00382] New coerce scheme" on 99/08/17, Toyofuku writes: | | 豊福@パパイヤです。 |けいじゅさん |> この方法で気になるのは, ほとんど同じアルゴリズムを持つ演算が2つづつ必要 |> になりますよね. | | でも例えば matrix.rb では Matrix に対する左側からの演算は |Scaler の方に書かれているわけで見た目クラスがわかれている |だけで実質2つずつ書かれているのと同じですよね。 同じですね。しかしこれは「行列*スカラー」と「スカラー*行列」 がたまたま同じだった(似ていた)だけだで、他のものどうしだった ら違う場合もあり得るわけです。 けいじゅさんの問題にしているのは、すでに Ba Bb Aa Ab という計算表がある時に C (= c) というクラスを加えて Ca Cb Cc Ba Bb Bc Aa Ab Ac という計算表の Cc の部分を2回記述するのがいやといいう事で しょう。Ca と Ac、Cb と Bc がたまたま一致しても無駄ではな い。(実際違う場合もありうるから。) 私の案は「C の op に Ca Cb Cc を、op! に Bc Ac を定義させよ」 という感じかな。 | 方針としては、 |・基本的に(iii)を使う。 |・(iii)に書くと不自然になるものは(ii)で書く。 |です。 そうなんですか? 私は基本的には (ii) を使うのではないかと。 coerce の問題点は、Cb と Bc の様に形式として対称であるは ずの処理が全然対称に見えなかったりすることと、利用法が定 まっていず、各クラスの間で紳士協定があるだけだということ です。何でもありえるので、とんでもない coerce を書いて正 しく計算する人が出てくるかもしれない。 だから、coerce を書かなくてすむなら、coerce なしで済ませ るというのが私の案です。多くの場合に当てはまるのではない かと。 Scalar は、行列の事を知っているスカラーという意味ですよ ね。下位の事を上位は知らなくていいという協定を破っていま すね。紳士的な協定破りで面白いけど。(^^