From: matz@... Date: 2015-05-24T16:43:13+00:00 Subject: [ruby-dev:48997] [Ruby trunk - Bug #11173] inter class/module alias causes "no superclass method" Issue #11173 has been updated by Yukihiro Matsumoto. 確かにおかしいですね。「似たような話」も含めて考えると混乱するので、いったん置いておくと、もとのプログラムはfooのスーパーをM0の親から探し始めて、C0#fooを見つけて欲しいような気もしますね。ただ、これは1.8でも同じ挙動をするので、なにか難しい問題があるのかもしれません。 mrubyで確認したら、あっちはaliasとsuperの関係が全然実装できてなかった。 Matz. ---------------------------------------- Bug #11173: inter class/module alias causes "no superclass method" https://bugs.ruby-lang.org/issues/11173#change-52624 * Author: Koichi Sasada * Status: Open * Priority: Normal * Assignee: * ruby -v: * Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN ---------------------------------------- ```ruby class C0 def foo p :C0 end end module M0 def foo p :M0 super end end module M1 include M0 alias orig_foo foo end class C1 < C0 include M1 end p C1.ancestors C1.new.orig_foo ``` 結果: ``` ruby 2.3.0dev (2015-05-21 trunk 50502) [i386-mswin32_110] [C1, M1, M0, C0, Object, Kernel, BasicObject] :M0 test.rb:12:in `foo': super: no superclass method `foo' for # (NoMethodError) from test.rb:26:in `
' ``` M0#foo の super である C0#foo が呼ばれてもいいと思うのですが、 この挙動はそういうもんでしたっけ。 挙動的には、M1 の alias で作られる method_entry が M0 の T_ICLASS (TI1) を指すけど、C1 からの継承関係で作られる M0 を指す T_ICLASS (TI2)と、TI1 が関係ないから、起こっているんだと思います。 なんか、class/module をまたいだ alias の挙動(と、その super での挙動)が色々怪しい感じです。 -- https://bugs.ruby-lang.org/