From: Yugui Date: 2008-01-14T22:27:03+09:00 Subject: [ruby-dev:33095] Coerce via aliased methods Yuguiです。 Fixnumのcoerceする演算は、エイリアス経由で使用すると例 外を生じるようです。 次のコードは1.8では"successfully coerced"と出力し ますが、trunkではNoMethodErrorを投げます。 >> class CoerceExample def coerce(operand) return self, operand end def +(rhs) p 'successfully coerced' end end class Fixnum alias plus + end 1.plus CoerceExample.new << ruby 1.9.0 (2008-01-14 revision 0) [i686-darwin9.1.0] coerce-bin.rb:14:in `plus': super: no superclass method `plus' for # (NoMethodError) from coerce-bin.rb:14:in `
' rb_num_coerce_binの実装において、 rb_frame_this_func()がエイリアスのほうの名前(この場 合、:plus)を返すためのようです。 coerceの意味から言って呼び出し時の名前を使うというのはもっと もらしい気もする一方、 「aliasすると挙動が変わるメソッド」というのはちょっと異 様です。 rb_frame_this_funcを直すべきなのか、rb_num_coerce_binを 直すべきなのかわかりませんが、 これのために現在1.9では 1 ** Rational(1, 2) が動 きません。 -- Yugui yugui@yugui.sakura.ne.jp http://idm.s9.xrea.com