From: Yugui Date: 2008-04-03T21:38:18+09:00 Subject: [ruby-dev:34236] module_eval via a wrapper method does not rewrite klass Yuguiです。 http://d.hatena.ne.jp/viver/20080107/p1 に書かれている問題を 調べてみました。 module_evalを他のメソッドでくるむと、メソッド定義先が書き換 わっていません。 もう少し詳しい状況が http://d.hatena.ne.jp/viver/20080109/ p1 に報告されています。 現在のtrunkでも再現します。[ruby-dev:34093]とは直 接の関係はなさそうです。 須藤さんのパッチを当てても再現します。 module_eval.rb: ==== class Module def my_module_eval(&block) module_eval(&block) end end class String Integer.my_module_eval do def hoge; end end end p Integer.instance_methods(false).map{|m|m.to_sym}.include?(:hoge) p String.instance_methods(false).map{|m|m.to_sym}.include?(:hoge) ==== これを実行すると、次のようです。 $ ruby -v module_eval.rb ruby 1.8.6 (2007-09-24 patchlevel 111) [i686-darwin9.2.0] true false $ ruby-trunk -v module_eval.rb ruby 1.9.0 (2008-03-29 revision 0) [i686-darwin9.2.0] false true vm_insnhelper.c:1074 (vm_define_method)にてklass = cref->nd_class が、本来 rb_cIntegerであるべきところ、rb_cStringになっています。 フレームの積み方を調べようとしたのですが、私の知識ではまだ理 解できていません。 もう少し調べてみるつもりでいますが、識者に教えていただけると 嬉しいです。 -- Yugui http://idm.s9.xrea.com 私は私をDumpする