Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

@pink_bangbi

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"
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What are the problem?