【Ruby】クラスの書き方と使い方の基本

作成日: 更新日:

開発環境

  • Ruby version: ruby 3.1.2

Rubyのクラス(class)とは

Rubyのクラス(class)とは、オブジェクトの設計図に相当するものです。 クラス(class)を定義して関連するデータやメソッドをクラス内にまとめることにより、コードをより効果的に構造化することができるだけでなく、再利用可能なコードを作成しやすくなります。 公式リファレンス:https://docs.ruby-lang.org/ja/latest/class/Class.html

Rubyのクラス(class)の書き方

Rubyのクラス(class)の書き方をご紹介します。

1# クラスの定義
2class クラス名
3    def インスタンスメソッド名
4        実行したい処理
5    end
6end
7
8# インスタンスの生成
9変数名 = クラス名.new()
10
11# インスタンスメソッドの実行
12変数名.インスタンスメソッド名

Rubyのクラスは「class」から始まり「end」で終わりとなります。 クラスからオブジェクトを作成するためには「newメソッド」を使用してインスタンスを生成し、生成したインスタンスに対してドット(.)の後にインスタンスメソッド名を記述することでインスタンスメソッドを実行することができます。

Rubyのクラスの命名規則

Rubyのクラスの命名規則にはいくつかルールがあります。

  • 英文字の大文字で始める
  • 2単語以上の場合はキャメルケース(各単語の先頭を大文字にして区別する)にする

英文字の小文字や2単語以上の場はスネークケース(各単語をアンダースコアで連結する)にすることもできますが、クラス名はクラスを識別するために英文字の大文字でキャメルケースで記述されることが一般的です。

Rubyのメソッド名の慣習

Rubyのメソッド名にはいくつか慣習があります。

  • 真偽値を返すメソッドには「?」をつけることが多い
  • 破壊的なメソッドには「!」をつけることが多い

また、メソッド名は「動詞のみ」または「動詞 + 目的語」で命名することにより、さらに可読性を高めることができます。

Rubyのメソッドの使い方

Rubyのメソッドのよくあるパターンをサンプルコードを用いて使い方の解説をしていきます。

Rubyのクラスでインスタンスメソッドを実行するパターン

Rubyのクラスでインスタンスメソッドを実行するパターンです。

1# メソッドの定義
2class Person
3    def info(name, age, gender)
4        "#{name}さんは#{age}歳の#{gender}です。"
5    end
6end
7
8# インスタンスの生成
9person = Person.new()
10
11# インスタンスメソッドの実行
12info = person.info("山田太郎", 30, "男性")
13
14# インスタンスメソッドの実行結果を出力
15puts(info)
16
17# => 山田太郎さんは30歳の男性です。

インスタンスメソッドは、クラスのインスタンス(オブジェクト)に対して呼び出されるメソッドです。 インスタンスメソッドは通常、オブジェクトの状態を変更するための操作や、オブジェクトの情報を取得するための操作などに使用されます。 また、インスタンスメソッド内では、そのインスタンスに関連するインスタンス変数(@変数名)にアクセスできます。 サンプルコードでは、変数「person」には生成されたインスタンスが代入されており、インスタンスが代入された変数「person」に対してドット(.)の後にインスタンスメソッド名を記述することにより、「Personクラス」の「infoメソッド」を実行しています。

Rubyのクラスでイニシャライズメソッドを実行するパターン

Rubyのクラスでイニシャライズメソッドを実行するパターンです。

1# メソッドの定義
2class Person
3    def initialize(name, age, gender)
4        @name = name
5        @age = age
6        @gender = gender
7    end
8
9    def info
10        "#{@name}さんは#{@age}歳の#{@gender}です。"
11    end
12end
13
14# インスタンスの生成
15person = Person.new("山田太郎", 30, "男性")
16
17# インスタンスメソッドの実行
18info = person.info()
19
20# インスタンスメソッドの実行結果を出力
21puts(info)
22
23# => 山田太郎さんは30歳の男性です。

イニシャライズメソッドは、新しいオブジェクトが生成される際に自動的に呼び出されます。 オブジェクトを生成する際に、必要な情報や初期値を提供するための手段として使用されることが多いため、オブジェクトの初期化を行うのに適しています。 サンプルコードでは、「Personクラス」を「newメソッド」でインスタンス生成する際に「initializeメソッド」に値を渡し、インスタンス変数に値がそれぞれ代入されてオブジェクトの初期化をしています。

Rubyのクラスを継承するパターン

Rubyのクラスを継承するパターンです。

1# メソッドの定義
2class Person
3    def initialize(name, age, gender)
4        @name = name
5        @age = age
6        @gender = gender
7    end
8
9    def info
10        "#{@name}さんは#{@age}歳の#{@gender}です。"
11    end
12end
13
14# クラスの継承
15class User < Person
16
17end
18
19class Admin < Person
20
21end
22
23# インスタンスの生成
24user = User.new("山田太郎", 30, "男性")
25admin = Admin.new("鈴木一郎", 40, "男性")
26
27# インスタンスメソッドの実行
28user_info = user.info()
29admin_info = admin.info()
30
31# インスタンスメソッドの実行結果を出力
32puts(user_info)
33# => 山田太郎さんは30歳の男性です。
34puts(admin_info)
35# => 鈴木一郎さんは40歳の男性です。

スーパークラス(親クラス)が持つプロパティやメソッドをサブクラス(子クラス)が継承することで、同じ機能やデータを複数のクラスで再利用できます。 似たような機能を持つクラスを新たに作成する際に、ゼロからコードを書く必要がなくなるだけでなく、共通の基盤となるクラスを定義できるためコードの一貫性と統一性を保つことができます。 また、サブクラスで新しい機能を追加できるため、アプリケーションの要件が変更された際にも容易に対応できる拡張性が高くなります。 サンプルコードでは、親クラスの「Person」から子クラスの「User」と「Admin」へ継承しているため、共通のイニシャライズメソッドを使用することができます。

Rubyのクラスでオーバーライドするパターン

Rubyのクラスでオーバーライドするパターンです。

1# メソッドの定義
2class Person
3    def initialize(name, age, gender)
4        @name = name
5        @age = age
6        @gender = gender
7    end
8
9    def info
10        "#{@name}さんは#{@age}歳の#{@gender}です。"
11    end
12end
13
14# クラスの継承
15class User < Person
16    def info
17        "ユーザーの#{@name}さんは#{@age}歳の#{@gender}です。"
18    end
19end
20
21class Admin < Person
22    def info
23        "管理者の#{@name}さんは#{@age}歳の#{@gender}です。"
24    end
25end
26
27# インスタンスの生成
28person = Person.new("佐藤大輔", 35, "男性")
29user = User.new("山田太郎", 30, "男性")
30admin = Admin.new("鈴木一郎", 40, "男性")
31
32# インスタンスメソッドの実行
33person_info = person.info()
34user_info = user.info()
35admin_info = admin.info()
36
37# インスタンスメソッドの実行結果を出力
38puts(person_info)
39# => 佐藤大輔さんは35歳の男性です。
40puts(user_info)
41# => ユーザーの山田太郎さんは30歳の男性です。
42puts(admin_info)
43# => 管理者のの鈴木一郎さんは40歳の男性です。

スーパークラス(親クラス)で定義されているメソッドをサブクラス(子クラス)で再定義することオーバーライドといいます。 サンプルコードでは、親クラスの「Person」から子クラスの「User」と「Admin」へ継承しているため、どちらも「infoメソッド」がありますが、子クラス側でユーザーと管理者に適した出力結果になるように上書きをしています。

おわりに

Rubyのクラスの使い方を解説してきました。 関連した処理をクラスにまとめることにより、コードの再利用がしやすくなり、コードの一貫性や統一性、拡張性がかなり高くなります。 オブジェクト指向プログラミングにおいてクラスの概念はとても重要なポイントになるため、最初は難しいかもしれませんがしっかりとクラスを使いこなしていきましょう。

【Ruby】クラスの書き方と使い方の基本 | いっしー@Webエンジニア