From: "shugo (Shugo Maeda)" Date: 2012-11-27T12:11:15+09:00 Subject: [ruby-dev:46640] [ruby-trunk - Bug #2402] super in instance_eval Issue #2402 has been updated by shugo (Shugo Maeda). shugo (Shugo Maeda) wrote: > instance_evalの中でsuperを呼んだ時に正しいレシーバを見つけるために r36640 で外側のフレームを辿る > ようにしたのですが、 Bug #6907 の問題があったので r36795 でrevertしました。 > > 現状はNotImplementedErrorがraiseされますが、こういうケースでsuperが呼べないのを仕様ということに > するなら(selfのtypeがおかしいという意味で)TypeErrorが妥当ですかねえ。 一点補足すると、1.8ではinstance_evalではフレームのselfは変えずにrb_evalの引数だけ変えているみたいなので instance_evalの中でsuperした時もちゃんと元のselfが使われるようですが、このためだけにselfを二重に持つのは 何だかなあという気がしています。 でもorphanなProcからsuperを呼んだ時とかを考えると他の方法を思い付きません。 ---------------------------------------- Bug #2402: super in instance_eval https://bugs.ruby-lang.org/issues/2402#change-34001 Author: shugo (Shugo Maeda) Status: Open Priority: High Assignee: ko1 (Koichi Sasada) Category: Target version: 2.0.0 ruby -v: ruby 1.9.2dev (2009-11-24 trunk 25909) [i686-linux] =begin instance_evalのブロック内でsuperを呼ぶと、instance_evalで変更された selfに対してsuperの呼び出しを行ってしまうようです。 defiant:build$ cat t.rb class Foo def foo p self end end class Bar < Foo def foo x = Object.new x.instance_eval do super end end end Bar.new.foo defiant:build$ ./ruby-trunk.1124 -v t.rb ruby 1.9.2dev (2009-11-24 trunk 25909) [i686-linux] # Foo#fooが呼ばれるのにselfがObjectという、ちょっとおかしなことになっています。 ちょっと自信がありませんが、一応パッチを添付します。 =end -- http://bugs.ruby-lang.org/