1. pink_bangbi

    Posted

    pink_bangbi
Changes in title
+Ruby で明示的に名前を指定して親クラスのメソッドを呼ぶ
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,94 @@
+[ブログ記事](https://secret-garden.hatenablog.com/entry/2020/09/15/200315)からの転載です。
+
+## 自身の親メソッドを呼ぶ
+
+自身と同じ名前の親メソッドを呼ぶ場合は `super` が利用できます。
+
+```ruby
+ def value
+ "Super#value"
+ end
+end
+
+class Sub < Super
+ def value
+ # Super#value を呼ぶ
+ super
+ end
+end
+
+p Sub.new.value
+# => "Super#value"
+```
+
+では、異なるメソッドから任意の親メソッドを呼ぶ場合はどうするのでしょうか。
+
+```ruby
+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` で親のメソッドオブジェクトを取得します。
+
+```ruby
+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` を利用して任意のクラスのメソッドを呼び出すこともできます。
+
+```ruby
+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"
+```