宿題
以下のコードを実行するとどうのような結果になりますでしょうか?
module Mod
def foo
puts "Mod"
end
end
class Cls1
include Mod
def foo
puts "Cls1"
super
end
end
class Cls2 < Cls1
def foo
puts "Cls2"
super
end
end
Cls2.new.foo
悩んでいるところ
クラスCls1は特に他のクラスから継承する明記がないのに、superはどういうことでしょうか?
実際の実行結果
[35] pry(main)> Cls2.new.foo
Cls2
Cls1
Mod
=> nil
解説
原因
rubyのメソッドにとって、自分のクラス → インクルードしているモジュール → スーパークラス → スーパークラスのインクルードしているモジュールの順に検索されます。
流れ
Cls2クラスのインスタンスでfooを呼び出すと、Cls2クラスのfooが実行され、Cls2を画面に出力したあと、superでCls1クラスのfooを呼び出します。
=> Cls2
Cls1クラスのfooの中でCls1を画面に出力した後、superでModモジュールのfooを呼び出し、Modを画面に出力します。
=> Cls1
=> Mod