From: Shin-ichro Hara Date: 1998-07-13T13:52:25+09:00 Subject: [ruby-list:8700] coerce (Re: Re: Equivalence.rb) 原です。 In message "[ruby-list:8692] Re: Equivalence.rb" on 98/07/11, Kazuhiro HIWADA writes: | |ひわだです。遅まきながらですが。 |'_' を演算子に見立ててしまえば良いのかも。 | |class Array | alias times_orig * | def *(x) | if x.kind_of?(Integer) | times_orig(x) | else | a, b = x.coerce(self); a * b | end | end |end |class Eq | class ReversedOp | def initialize(v); @v=v end | def *(x); p [@v,x] end | end | def initialize(v); @v=v end | def coerce(x); [ReversedOp.new(x), self] end |end | |eq = Eq.new("hoge"); |p [1]*eq ここの | def *(x); p [@v,x] end は | def *(x); [@v,x] end と書きたかったのかな? なるほど、私はどうも coerce のことを考えると頭の中がごちゃごちゃに なってしまうんですが、ひわださんの例を見て今度こそわかったような気 がしました。(また忘れそうだけど。) coerce の標準的な定義の仕方というのは、結局、 x.coerce(y) = [ x に応じて y をうまく変換したもの, y に応じて x をうまく変換したもの ] なんですね。しかし coerce が出てくると x と y の前後関係が何度も入れ替 わって、しばしばわかりにくいと感じるのは私だけでしょうか。もし、 x.coerce(y) = [ y に応じて x をうまく変換したもの, x に応じて y をうまく変換したもの ] だったらずっとわかりやすかったのにと思うんですが。まあ、 そうすると | a, b = x.coerce(self); a * b のところを b, a = x.coerce(self); a * b と書かなくてはいけなくて、同じといえば同じで好みの問題ですけど、 何回ひっくり返ったか局所的に認識できるこっちの流儀の方がいい感じ を持ちます。