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 #<C1:0x109634c> (NoMethodError)
from test.rb:26:in `<main>'
```
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/