hotoolong's blog

プログラムのことやエンジニアリングに関することを記事にしています。

Rubyの継承元のクラスの別メソッドをsuperで呼び出す

イントロ

Rubyの継承先で継承元のメソッドを単純に呼び出すにはsuperを使いますが、
継承元の別メソッドを呼び出したい場合にどうしていいのかわからなかったので調べてみました。

詳細

class A
  def test1(*args)
    puts "A#test1:args(#{args})"
  end

  def test2(*args)
    puts "A#test2:args(#{args})"
  end
end

class B < A
  def test1(*args)
    puts "B#test1:args(#{args})"
  end

  def test2(*args)
    method(:test1).super_method.call(*args)
    puts "B#test2:args(#{args})"
  end
end

B.new.test2('test')
# => A#test1:args(["test"])
# => B#test2:args(["test"])

Aを継承したBのtest2メソッドを呼び出しているのですが、
test2の処理でAクラスのtest1メソッドを呼び出したくなった場合に
以下の処理で呼び出しています。

method(:test1).super_method.call(*args)

method(:test1)でMethodオブジェクトを取り出して
super_methodで親のAクラスのtest1メソッドのMethodオブジェクトを呼びだせます。
これは便利ですね。

参考URL

親クラスの別のメソッドを呼ぶ - Qiita
class Method (Ruby 2.7.0 リファレンスマニュアル)