Ruby で明示的に名前を指定して親クラスのメソッドを呼ぶ

自身の親メソッドを呼ぶ

自身と同じ名前の親メソッドを呼ぶ場合は super が利用できます。

  def value
    "Super#value"
  end
end

class Sub < Super
  def value
    # Super#value を呼ぶ
    super
  end
end

p Sub.new.value
# => "Super#value"

では、異なるメソッドから任意の親メソッドを呼ぶ場合はどうするのでしょうか。

class Super
  def value
    "Super#value"
  end
end

class Sub < Super
  def value
    "Sub#value"
  end

  def value2
    # ここで Super#value を呼び出したい
  end
end

答え: Method#super_method を使う

こういう場合は Method#super_method が利用できます。 次のようにして任意のメソッドオブジェクトを取得し、 #super_method で親のメソッドオブジェクトを取得します。

class Super
  def value
    "Super#value"
  end
end

class Sub < Super
  def value
    "Sub#value"
  end

  def value2
    # value のメソッドオブジェクトを取得し、その親メソッドを参照する
    method(:value).super_method.call
  end
end

p Sub.new.value2
# => "Super#value"

おまけ

以下のように .instance_method を利用して任意のクラスのメソッドを呼び出すこともできます。

class Super
  def value
    "Super#value"
  end
end

class Sub < Super
  def value
    "Sub#value"
  end

  def value2
    Super.instance_method(:value).bind(self).call
  end
end

p Sub.new.value2
# => "Super#value"