3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

ブログ記事からの転載です。

自身の親メソッドを呼ぶ

自身と同じ名前の親メソッドを呼ぶ場合は 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"
3
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?