【Ruby入門】クラスメソッドの使い方|呼び出し・その他メソッド

こんにちは! フリーエンジニアの長瀬です。

Rubyを使ってプログラミングをする際には必須とも言えるべきクラスメソッドの活用。

しかし、そもそもクラスメソッドとは何か、そして具体的にどのような活用方法があるのかについてはご存知でしょうか?

そこで今回は、

【基礎】メソッドとは
【基礎】メソッドの使い方
【基礎】クラスメソッドの使い方
【発展】クラスメソッドをprivateにする方法
【発展】クラスメソッドの継承

などについて解説していきます。

今回はクラスメソッドとは何で、それをどのように定義するのか、そしてクラスメソッドをprivateにする方法や継承についてご紹介しますのでぜひ参考にしてください。

メソッドとは

Rubyにおけるメソッドとは、標準で組み込まれているメソッド(関数)ではなく、ユーザーが独自に定義できる関数のことをメソッドと呼びます。

メソッドを定義することにより、共通した処理をひとまとめにすることができて、メソッドを呼び出すことによって何度でも使用することができます。

Rubyのメソッドは始まりに「def」を指定し、メソッドの終わりに「end」を記述し、その中に実行する処理を記述します。

次項より、メソッドの使い方を詳しく見ていきましょう。

メソッドの使い方

メソッドを定義する方法

それではまずは基本的なメソッドの作成方法から学んでいきましょう。

sayというメソッドを定義してみます。

[実行結果]

このように、defを使うことで簡単にメソッドを定義できますね!

sayと入力するだけで、puts “YOLO”が実行されました。

また、メソッドでは引数をあらかじめ設定することもできます。

次にgoodbyeという引数付きのメソッドを定義してみましょう。

[実行結果]

Goodbyeに続き文字列を引数(“World!”)から出力できました。

文字列の中で、メソッドに渡した値を使用したいときには#{}で変数を囲む必要があります。

今回の場合はnameが引数なので、#{name}となっています。

これで基本的なメソッドの定義方法をご理解いただけたかと思います。

defでメソッドを定義する方法についてはこちらの記事にまとめてありますのて、参考にしてみてください。

メソッドの呼び出し

通常、メソッドというものはすべてクラスに定義されているので

という具合に呼びだすことができます。

例えば、Rubyの文字列オブジェクトのクラスはStringなのでStringクラスにあるメソッドを使用することができます。

この場合、(あるクラスを継承した)オブジェクトはnameで、メソッドはreplaceです。

そして、replaceの第1引数は”Bushi”です。

通常メソッドを呼び出す場合はこのように、呼び出します。

ですが、トップレベルにメソッドが定義されていた場合はオブジェクトを省略してメソッドを呼び出すことができます。

例えばさきほど紹介したgoobyeメソッドは、オブジェクトを省略して呼び出していますよね?

また、{ブロック}を渡す場合は例えば配列の場合だと

[実行結果]

{|content| p content}の部分がブロックを渡している部分です。

このように、メソッドによってはブロックを渡せる場合もあるので覚えておいてください。

クラスメソッドの基礎知識を知ろう!

クラスメソッドとは

クラスメソッドとは何か、一言で言うと「クラスオブジェクトから実行可能なメソッド」です。

クラスメソッドの対比としてインスタンスメソッドがあります。こちらはクラスに対してではなく、クラスのインスタンス(実体)に対して紐づけられるメソッドです。

また、クラスメソッドはクラスをレシーバとして呼び出すメソッドでもあります。

実際にクラスメソッドとインスタンスメソッドのサンプルコードを見てみましょう。

[クラスメソッド]

[実行結果]

[インスタンスメソッド]

[実行結果]


上記コードにありますように、クラスメソッドはクラスをレシーバに呼び出されている一方、インスタンスメソッドはそうなっていません。

クラスメソッドの定義方法

クラスメソッドの定義方法としては4つあります。

selfで定義

これが最も一般的な定義方法です。以下のように、メソッド名の先頭に「self.」をつけます。

class << self

上記のように、毎回selfをメソッドに付けるのが面倒な場合は一括で行う方法もあります。


以下の2つはあまり使わない定義方法ではありますが、ご紹介します。

クラス定義スコープの外部で定義(1)

クラス定義スコープの外で、define_singleton_methodを使ってechoというクラスメソッドを定義しています。

クラス定義スコープの外部で定義(2)

こちらもクラス定義スコープ外でhogeクラスメソッドを定義しています。

発展的なクラスメソッドの使い方を見よう!

ここでは、さらに応用したクラスメソッドの使い方について説明します。

クラスメソッドをprivateにする

Rubyのスコープには、

  • public
  • protected
  • private

の3種類があります。

クラスメソッドのスコープをprivateにすることはどのような意味を持つのでしょうか?

クラスメソッドをprivateにすると、クラスメソッドをそのクラス内でしか呼び出せないようになります。

また、private_class_methodを使うことで、クラスやモジュールのクラスメソッドをprivateなメソッドに変更することができます。

以下の例では、newをprivateにすることで外部からのインスタンス化を禁止しています。

クラスメソッドの継承

クラスメソッドの継承についてはこちらの記事で詳しく解説しています。継承をしたい場合はこちらを参照してください。

クラスメソッドを継承させることで、継承したクラスに定義してあるメソッドをそのまま使うことができるようになります。

【Ruby入門】クラスの継承まとめ
更新日 : 2019年2月13日

まとめ

この記事では、クラスメソッドの使い方を解説しました。

  • クラスメソッド
  • インスタンスメソッドの違い
  • クラスの定義方法

などを本記事では紹介しました。

また、private_class_methodでメソッドを指定するとprivateなメソッドに変えられることも学びました。

クラスメソッドを理解することは、オブジェクト志向で作成されているRubyの言語の仕様を理解する上でとても大切になってきます。

なので、しっかりと復習しておいてください。

もしクラスメソッドの使い方について忘れてしまったらこの記事を確認してくださいね!

LINEで送る
Pocket

最短でエンジニアを目指すなら侍エンジニア塾

cta_under_bnr

侍エンジニア塾は業界で初めてマンツーマンレッスンを始めたプログラミングスクールです。これまでの指導実績は16,000名を超え、未経験から数多くのエンジニアを輩出しています。

あなたの目的に合わせてカリキュラムを作成し、現役エンジニア講師が専属であなたの学習をサポートするため効率よく学習を進めることができますよ。

無理な勧誘などは一切ありません。まずは無料体験レッスンを受講ください。

無料体験レッスンの詳細はこちら

書いた人

長瀬来

長瀬来

Unityを使ったiOSアプリのリリース、フリマサイト運営の経験があります。

経験した言語はC、C#、Javascript、R、Python、Ruby、PHPなど

言語が好きで、英語や中国、ドイツ語を勉強しました。
将来的には海外で生活したいです。

現在はRuby on Rails5やCocos2dxの勉強を主にしています。

ライターとしては
できるだけ初心者にわかりやすい文章になるように心がけています。

趣味は語学、読書です。

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説