クラスメソッドでインスタンスを作らずにメソッドを使おう
学習の目標
本章では、以下の内容を学習します。
- クラスメソッドの概念と基本的な定義方法を理解する
- インスタンスメソッドとクラスメソッドの違いを学ぶ
- クラスメソッドの実用的な使い方を習得する
- クラスメソッドを使ったファクトリーメソッドのパターンを理解する
はじめに
これまでの章では、クラスからインスタンスを作成し、そのインスタンスに対してメソッドを呼び出す方法を学んできました。これらのメソッドはインスタンスメソッドと呼ばれ、特定のインスタンスに対して動作します。
しかし、Rubyにはクラスメソッドという、インスタンスを作成せずに直接クラス自体から呼び出せるメソッドもあります。クラスメソッドは、インスタンスの個別の状態に依存しない処理や、新しいインスタンスを作成する処理などに便利です。
今回は、このクラスメソッドについて詳しく学んでいきましょう。
ファイルの準備
まずは、class_method.rb
というファイルを作成しましょう。VS Codeで新しいファイルを作成し、これから書いていくコードを保存していきます。
クラスメソッドとインスタンスメソッドの違い
まずは、インスタンスメソッドとクラスメソッドの基本的な違いを見てみましょう。
class Character # インスタンスメソッド def hello puts "こんにちは" end
# クラスメソッド def self.info puts "これはRPGのキャラクタークラスです" endend
# インスタンスメソッドの使い方hero = Character.newhero.hello # こんにちは
# クラスメソッドの使い方Character.info # これはRPGのキャラクタークラスです
上のコードでは、hello
メソッドはインスタンスメソッド、info
メソッドはクラスメソッドとして定義しています。
クラスメソッドの定義方法
クラスメソッドを定義するには、メソッド名の前にself.
をつけます。このself
は、クラス自身を指しています。
インスタンスメソッドとクラスメソッドの呼び出し方の違い
インスタンスメソッドとクラスメソッドの呼び出し方には明確な違いがあります。
インスタンスメソッド:
new
でインスタンスを作成してから使うインスタンス名.メソッド名
の形式で呼び出す- 例:
hero.hello
クラスメソッド:
- インスタンスを作らずに直接クラスから呼び出せる
クラス名.メソッド名
の形式で呼び出す- 例:
Character.info
クラスメソッドは、特定のインスタンスに依存しない処理や、クラス全体に関わる機能を提供するのに適しています。
クラスメソッドの便利な使い方
クラスメソッドは、様々な場面で活用できますので、例を見ていきましょう。
ここでは、RPGのキャラクターを表すCharacter
クラスを例に、クラスメソッドの使い方を説明します。
以下の例では、職業ごとに決まった設定のキャラクターを作成するためのメソッドをクラスメソッドとして定義しています。
class Character def self.create_warrior puts "戦士を作成します" new("戦士", 200) end
def self.create_wizard puts "魔法使いを作成します" new("魔法使い", 100) end
def initialize(job, hp) @job = job @hp = hp end
def status puts "職業:#{@job}" puts "HP:#{@hp}" endend
warrior = Character.create_warriorwarrior.status # 職業:戦士、HP:200と表示
wizard = Character.create_wizardwizard.status # 職業:魔法使い、HP:100と表示
この例では、create_warrior
とcreate_wizard
というクラスメソッドを定義しています。これらのメソッドは、それぞれ戦士と魔法使いのキャラクターを作成します。
仮に、クラスメソッドを定義していない場合、キャラクターの職業やHPを指定しながらインスタンスを作成する必要があります。
# クラスメソッドを使わない場合class Character def initialize(job, hp) @job = job @hp = hp end
def status puts "職業:#{@job}" puts "HP:#{@hp}" endendwarrior = Character.new("戦士", 200)wizard = Character.new("魔法使い", 100)
もちろんこれでもキャラクターを作成できますが、毎回職業やHPを指定する必要があります。これだと毎回同じようなコードを書くことになりますし、入力ミスの原因にもなります。
一方、クラスメソッドを使うことで、create_warrior
やcreate_wizard
を呼び出すだけで、決まった設定のキャラクターを簡単に作成できます。
このように、クラスメソッドは特定のインスタンスに依存しない処理や、決まった設定でインスタンスを作成する処理などに便利です。ちなみに、このようにインスタンスを作成するためのクラスメソッドをファクトリーメソッドと呼ぶことがあります。
クラスメソッドの活用例
実際のプログラミングでは、クラスメソッドが活躍する場面がたくさんあります。
Ruby on Rails のプログラミングにおいてよく使われるクラスメソッドの例をいくつか挙げてみましょう。
日付や時間の処理
Rubyの標準ライブラリであるDate
やTime
クラスでは、現在の日付や時刻を取得するためのクラスメソッドが提供されています。
Ruby では require
を使って標準ライブラリを読み込むことができますので、最初に読み込んでいます。
require 'date'
today = Date.today # 今日の日付now = Time.now # 現在の時刻
上記の例では Date
クラスの today
メソッドと、Time
クラスの now
メソッドを使って、今日の日付と現在の時刻を取得しています。
文字列の変換や処理
次は、自分で定義したクラスの例です。文字列を変換するためのクラスメソッドを定義しています。
ここでは、文字列を大文字に変換するto_uppercase
メソッドと、小文字に変換するto_lowercase
メソッドを定義しています。
class StringConverter def self.to_uppercase(str) str.upcase end
def self.to_lowercase(str) str.downcase endend
upper = StringConverter.to_uppercase("hello") # "HELLO"lower = StringConverter.to_lowercase("WORLD") # "world"
これらの例のように、クラスメソッドは特定のインスタンスに依存しない、汎用的な処理を提供するのに適しています。
上記のようなクラスを定義することで、色んなクラスから共通の処理を呼び出すことができ、コードの重複を避けることができます。
まとめ
本章では、クラスメソッドについて学びました。以下の内容を理解できたことと思います。
- クラスメソッドは、メソッド名の前に
self.
をつけて定義する - クラスメソッドは、インスタンスを作成せずに直接クラスから呼び出せる
- インスタンスメソッドは特定のインスタンスに対して動作するが、クラスメソッドはクラス全体に関わる機能を提供する
クラスメソッドを適切に活用することで、より読みやすく、メンテナンスしやすいコードを書くことができます。特に、インスタンスの状態に依存しない処理や、決まった設定でインスタンスを作成する処理などは、クラスメソッドとして定義すると便利です。
いまは難しく感じるかもしれませんが、実践的なアプリ開発ではよく登場しますので、頭の片隅に留めておきましょう。
Starterプランでより詳しく学習
この先のコンテンツを読むにはStarterプラン以上が必要です。より詳細な解説、実践的なサンプルコード、演習問題にアクセスして学習を深めましょう。