ブログ記事からの転載です。
自身の親メソッドを呼ぶ
自身と同じ名前の親メソッドを呼ぶ場合は 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"