From: Yusuke ENDOH Date: 2009-11-24T13:09:52+09:00 Subject: [ruby-dev:39762] Re: [Bug #2395] 可視性の変更による alias されたメソッドの無効化 遠藤です。 2009年11月24日12:55 Yusuke ENDOH : > 2) 同じクラスで alias を作ったらメソッド実体の実体がコピーされるのに > 継承先で alias を作ったら実体はコピーされない (1.8 も 1.9 も) > > class C > private > def foo; "foo"; end > alias bar foo > public :bar > end > class D < C > public :foo > alias baz foo > end > class C > undef foo > end > p D.new.bar #=> "foo" > p D.new.baz #=> NoMethodError > (snip) > > 2) は仕様かどうか聞かないとわかりません。 こっちは間違いでした。public や private を外すと、1.8 でも 1.9 でも class C def foo; "foo"; end alias bar foo end class D < C alias baz foo end class C undef foo end p D.new.bar #=> "foo" p D.new.baz #=> "foo" と問題なく動くので、やはり可視性もからんだ問題ですね。 スーパークラスのメソッドの public/private を ZSUPER で実装することが 原因だと思いますが、どう直したものでしょうね。ZSUPER を alias する時は メソッド実体を複製する? -- Yusuke ENDOH