恥ずかしいことに、今までsuperの意味を、「親のクラスの同じメソッドを、親のクラスのコンテキストで実行する」かと思っていました。
なので、次の例で結果が「"fuga"」にならないのを見て少しはまりました。
class Hoge def hoge fuga end def fuga "fuga" end end class CHoge < Hoge def hoge super end def fuga "cfuga" end end p CHoge.new.hoge #=> "cfuga"
この結果は、「fuga」でなく「cfuga」になります。
僕のイメージでは、最初に「CHoge#hoge」が呼ばれ、「super」によって、「Hoge#hoge」が呼ばれ、それが、「Hoge#fuga」を呼ぶのかと勘違いしていました。2つ目から勘違いですね。
「super」は現在のクラスのコンテキストで、「親クラスのメソッドの機能を実行する」だったんですね。正しくは、最初に「CHoge#hoge」が呼ばれ、「super」によって、「Choge」のコンテキストで、「Hoge#hoge」の機能(=fugaメソッドを呼ぶ)が実行され、当然、「Choge#fuga」が実行される。ということだったですね。
すっきりしました。
もし、「Choge#fuga」を自分で定義していない場合は、「Hoge#fuga」を継承しているので、結果は「fuga」になりますね。