superの挙動を勘違いしていた

恥ずかしいことに、今まで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」になりますね。