Rubyのsuperキーワード徹底解説!親クラスメソッドの呼び方と使い分け
Rubyのsuperキーワードは、いったい何をしてくれるのでしょうか?
superは、そのキーワードを呼び出したメソッドと同じ名前のメソッドを、親クラスに対して呼び出すための仕組みです。
たとえば、i_like_chocolateという名前のメソッドの中でsuperを呼び出すと、Rubyはそのメソッドを持つクラスの親クラスから、同じ名前のメソッドを探しに行きます。
見つからなければ、さらにその上の祖先クラスへと、通常のメソッド呼び出しと同じように辿っていきます。
最後まで同名のメソッドが存在しなかった場合はNoMethodError例外が発生し、途中にmethod_missingが定義されていればそちらが使われます。
それでは、実際のコード例を見ていきましょう!
引数なしでsuperを使う
次の例では、Animalクラスを継承したCatクラスを定義しています。
Catクラスにはnameメソッドがあり、その中でsuperを使って親クラス(Animal)の同名メソッドを呼び出しています。
コードは以下の通りです:
class Animal
def name
puts "Animal"
end
end
class Cat < Animal
def name
super
end
end
cat = Cat.new
cat.name
# "Animal"
Rubyのsuperキーワードは、引数を付けるか付けないかで挙動が変わる点に注意が必要です。
引数なしの場合:
元のメソッド呼び出しに渡された引数が、そのまま親クラスのメソッドへ引き継がれます。キーワード引数やブロックも同様に引き継がれます。
具体例を見てみましょう:
def puts(*) super end puts 1, 2, 3
このメソッドはどのクラスにも属していないため、自動的にObjectクラスのインスタンスメソッドとして定義されます。つまり、元のputsメソッドよりも先に呼ばれることになります。
ここでputsを呼び出すと、実際には新しく定義したこちらのメソッドが実行され、その中のsuperによって元のputsが呼び出される仕組みです。
superとsuper()の使い分け
ここまで、superで親クラスのメソッドを呼ぶ方法を見てきました。
しかし、親クラスのメソッドが同じ数の引数を受け取らない場合はどうすればよいのでしょうか?
そんなときは次のように使い分けます:
super()… 引数を渡さずに呼び出したい場合super(arg1, arg2, ...)… 渡す引数を自分で選びたい場合
例:
def puts super() end
通常のメソッド呼び出しではカッコは省略可能ですが、superの場合はカッコの有無に特別な意味がある点に注意してください。
superについて、あといくつか知っておくべきポイントがあります:
- メソッドの中でしか使えない
- 親メソッドの戻り値をそのまま返す
- 複数回呼び出すこともできる
太字にした「superは戻り値を返す」という性質は、実務でよく見かけるsuperの応用パターンを理解するうえで重要です。
この性質を利用すると、デコレーターパターンの実装や、initialize内でsuperを呼んで親クラスのインスタンス変数を初期化するといったことができます。
まとめ
この記事では、Rubyのsuperキーワードについて、その仕組みとさまざまな状況での挙動を学びました!
引数の有無による挙動の違いや、super()との使い分けをマスターすれば、継承を活用した柔軟なオブジェクト指向設計ができるようになります。ぜひ実際のコードで試してみてください。
-
Rubyのgrepメソッド徹底解説!使い方とselectとの違いを実例で学ぶ
今回はRubyのgrepメソッドについて詳しく見ていきます。 このメソッドにはどんな便利さがあるのでしょうか? grepを使えば、配列(Array)や範囲(Range)など、Enumerableモジュールを含むオブジェクトから、条件に一致する要素だけを効率よく抽出できます。 「それってselectでも同じことができるのでは?」 確かにそうですが、grepはselectとは異なる仕組みで動作し、得られる結果も異なります。この違いを理解すれば、コードをより簡潔に書けるようになりますよ。 それでは、実際の例を見てみましょう。 Ruby grepメソッドの実例集 まず、次のような配列を用意します。
-
Rubyのmapメソッド完全ガイド!配列・ハッシュのデータ変換を実例で解説
Rubyのmapメソッドは、配列(Array)・ハッシュ(Hash)・範囲(Range)といったコレクションに対して使用できる強力なメソッドです。 mapの主な用途は、データの変換です。 例えば、文字列の配列があった場合、すべての文字列を順番に処理して、各文字を大文字に変換することができます。 また、Userオブジェクトのリストがある場合も同様です。 それらを変換して、対応するメールアドレスや電話番号など、Userクラスに定義された任意の属性のリストを作成できます。 それでは、具体的な使い方を見ていきましょう! Ruby mapメソッドの基本構文 mapの構文は次のようになっています。 a