【Ruby】レッスン5-02:イニシャライザを理解しよう

記事内に商品プロモーションを含む場合があります

この記事で学べる知識:イニシャライザ

この記事の練習問題を解くために必要な知識:
基礎文法、制御構造、メソッド、コレクション(レッスン1~4)クラスの定義と使用イニシャライザアクセスメソッドattr_accessorクラス変数とクラスメソッドprivateメソッド正規表現クラスの継承ファイル操作オーバーライドモジュールの定義と使用ミックスイン

<<前のページ Ruby記事一覧 次のページ>>

Rubyの「イニシャライザ」とは

ここではイニシャライザの意味や使い方を学習します。必要ない方はここをクリックして練習問題へ飛びましょう。

イニシャライザはクラスからインスタンスを生成する際に自動的に呼び出される特別なメソッドです。他の言語で「コンストラクタ」と呼ばれる機能に相当します。

Rubyではこのメソッドはinitializeという名前で定義されます。

イニシャライザの主な役割はインスタンス変数を初期化し、インスタンスが正しく動作するための設定を行うことです。

Rubyでは通常のメソッドと同じように引数を取ることができるため、柔軟な初期化処理が可能です。

【初心者向け】Rubyのオブジェクト指向を分かりやすくまとめた概念図。 特にクラスの継承、オーバーライド、モジュール、ミックスイン、インスタンス生成の関係性を視覚的に理解できるようまとめている。

Rubyのイニシャライザの記述方法

イニシャライザを定義するにはクラス内でinitializeメソッドを作成します。

initializeメソッドはインスタンス生成時に自動で呼び出されるため、明示的に呼び出す必要はありません。

イニシャライザの基本構造

以下のコードはイニシャライザの基本的な記述例です。

class User
  def initialize(name, age)
    @name = name  # インスタンス変数の初期化
    @age = age    # インスタンス変数の初期化
  end
end

# インスタンスを生成
user = User.new("Taro", 25)

ここではinitializeメソッドで@name@ageというインスタンス変数を初期化しています。

この@が付いた変数はインスタンス変数と呼ばれ、インスタンスごとに固有の値を持ちます。

使用例:シンプルなクラス定義とインスタンス生成

実際の使用例を見てみましょう。

以下はユーザー情報を管理するクラスの例です。

class User
  def initialize(name, email) #イニシャライザの定義
    @name = name      # 名前をインスタンス変数に格納
    @contact = email  # メールアドレスをインスタンス変数に格納
  end

  def display_info    #display_infoメソッドの定義
    puts "Name: #{@name}, Email: #{@contact}"
  end
end

# インスタンス生成
user1 = User.new("Yuki", "yuki@example.com")
user2 = User.new("Hana", "hana@example.com")

# 情報の表示
user1.display_info  #=> Name: Yuki, Email: yuki@example.com
user2.display_info  #=> Name: Hana, Email: hana@example.com

このコードではinitializeメソッドを使用して@name@contactを初期化しています。

その後display_infoメソッドを呼び出して情報を出力しています。

これにより各インスタンスが異なるデータを持つことが確認できます。

注意点:インスタンス変数と外部アクセス

Rubyのインスタンス変数はクラス内でのみアクセス可能です。

そのため以下のように直接外部からアクセスすることはできません。

puts user1.@name  # エラーになる

必要に応じてインスタンス変数の値を外部に公開するためには「アクセスメソッド」を使用します。

これは次の章で詳しく解説します。

まとめ:イニシャライザを使いこなそう

イニシャライザはクラスからインスタンスを生成する際に初期化処理を行う重要な役割を持っています。

この機能を理解することでRubyのオブジェクト指向をより深く学ぶことができます。

次回はインスタンス変数へのアクセスを可能にする「アクセスメソッド」について学びます。

イニシャライザの確認問題:図書館の書籍情報を管理するプログラムを作ろう

書籍を管理する図書館システムを作成しましょう。書籍を追加し、全ての書籍の情報を表示する機能を実装します。

書籍には「タイトル」「著者」「ページ数」が含まれ、これらの情報はコンストラクタを使って初期化します。

また、図書館は複数の書籍を管理でき、書籍の追加や表示の機能を提供します。

この問題の要件

以下の要件に従ってコードを完成させてください。

  • Bookクラスを定義し、コンストラクタinitializeで「タイトル」「著者」「ページ数」を初期化すること。
  • display_infoメソッドを定義し、書籍の情報を表示すること。
  • Libraryクラスを定義し、書籍を追加するadd_bookメソッドと、全ての書籍の情報を表示するdisplay_booksメソッドを実装すること。
  • ユーザーが書籍を追加したり、全ての書籍情報を表示したりできるメインプログラムを作成すること。

ただし、以下のような実行結果となること。

----- ↓出力される結果の例↓ -----

1. 書籍を追加
2. 全ての書籍の情報を表示
3. 終了
1
書籍のタイトルを入力してください:
Ruby入門
著者を入力してください:
山田太郎
ページ数を入力してください:
300
書籍を追加しました。
1. 書籍を追加
2. 全ての書籍の情報を表示
3. 終了
2
全ての書籍の情報:
タイトル: Ruby入門, 著者: 山田太郎, ページ数: 300
1. 書籍を追加
2. 全ての書籍の情報を表示
3. 終了
3
プログラムを終了します。

この問題を解くヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。

1:Bookクラスの定義
  □ initializeメソッドの定義(コンストラクタ)
  □ □ インスタンス変数@titleをtitleで初期化
  □ □ インスタンス変数@authaorをauthorで初期化(誤字注意:authorではなくauthaorになっています)
  □ □ インスタンス変数@pagesをpagesで初期化
  □ display_infoメソッドの定義
  □ □ putsで書籍の情報を出力(@title、@authaor、@pagesを使用)

2:Libraryクラスの定義
  □ initializeメソッドの定義(コンストラクタ)
  □ □ インスタンス変数@booksに空の配列を代入
  □ add_bookメソッドの定義
  □ □ 引数bookを@books配列に追加
  □ display_booksメソッドの定義
  □ □ eachメソッドで@books配列の各要素に対してdisplay_infoメソッドを呼び出し

3:メインプログラム
  □ Libraryクラスのインスタンスをlibraryとして生成
  □ exit_program変数をfalseで初期化(終了フラグ)
  □ whileループの開始(!exit_programが条件)
  □ □ putsで選択肢メニューを出力
  □ □ ユーザーの選択肢を取得し、変数choiceに代入(数値に変換)
  □ □ case文でchoiceを分岐処理
  □ □ □ when 1の場合、書籍情報を入力し、Bookクラスのインスタンスを作成し、libraryに追加
  □ □ □ □ putsで「書籍を追加しました。」と出力
  □ □ □ when 2の場合、libraryのdisplay_booksメソッドを呼び出し、全書籍情報を出力
  □ □ □ when 3の場合、プログラムを終了するメッセージを出力し、exit_programをtrueに設定
  □ □ □ elseの場合、無効な選択である旨を出力

ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

# 書籍を表すクラス
class Book
  # コンストラクタで書籍のタイトル、著者、ページ数を初期化する
=begin
  【穴埋め問題1】
  ここにinitializeメソッドを定義し、書籍のタイトル、著者、ページ数を初期化するコードを書いてください。
  引数としてtitle, author, pagesを受け取り、それをインスタンス変数に代入してください。
=end

  # 書籍の情報を表示するメソッド
  def display_info
    puts "タイトル: #{@title}, 著者: #{@authaor}, ページ数: #{@pages}"
  end
end

# 図書館を管理するクラス
class Library
=begin
  【穴埋め問題2】
  ここにLibraryクラスのinitializeメソッドを定義し、書籍を格納する空の配列@booksを初期化するコードを書いてください。
=end

  # 書籍を図書館に追加するメソッド
  def add_book(book)
    @books << book
  end

  # 全ての書籍の情報を表示するメソッド
  def display_books
    @books.each do |book|
      book.display_info
    end
  end
end

# メインプログラム
library = Library.new

exit_program = false # プログラムの終了フラグ

while !exit_program
  puts "1. 書籍を追加"
  puts "2. 全ての書籍の情報を表示"
  puts "3. 終了"
  choice = gets.chomp.to_i

  case choice
  when 1
    puts "書籍のタイトルを入力してください:"
    title = gets.chomp
    puts "著者を入力してください:"
    author = gets.chomp
    puts "ページ数を入力してください:"
    pages = gets.to_i
=begin
    【穴埋め問題3】
    ここにBookクラスのインスタンスを作成し、それをlibraryに追加するコードを書いてください。
=end
    puts "書籍を追加しました。"
  when 2
    puts "全ての書籍の情報:"
    library.display_books
  when 3
    puts "プログラムを終了します。"
    exit_program = true
  else
    puts "無効な選択です。もう一度入力してください。"
  end
end

この問題の穴埋めコードは以上です。

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。



確認問題の解答と解説

この問題の一つの正解例とそのコードの解説を以下に示します。

正解コードの例

例えば以下のようなプログラムが考えられます。

# 書籍を表すクラス
class Book
  # コンストラクタで書籍のタイトル、著者、ページ数を初期化する
  def initialize(title, author, pages)
    @title = title
    @authaor = author
    @pages = pages
  end

  # 書籍の情報を表示するメソッド
  def display_info
    puts "タイトル: #{@title}, 著者: #{@authaor}, ページ数: #{@pages}"
  end
end

# 図書館を管理するクラス
class Library
  def initialize
    @books = [] # 書籍のリストを格納する配列
  end

  # 書籍を図書館に追加するメソッド
  def add_book(book)
    @books << book
  end

  # 全ての書籍の情報を表示するメソッド
  def display_books
    @books.each do |book|
      book.display_info
    end
  end
end

# メインプログラム
library = Library.new

exit_program = false # プログラムの終了フラグ

while !exit_program
  puts "1. 書籍を追加"
  puts "2. 全ての書籍の情報を表示"
  puts "3. 終了"
  choice = gets.chomp.to_i

  case choice
  when 1
    puts "書籍のタイトルを入力してください:"
    title = gets.chomp
    puts "著者を入力してください:"
    author = gets.chomp
    puts "ページ数を入力してください:"
    pages = gets.to_i
    book = Book.new(title, author, pages)
    library.add_book(book)
    puts "書籍を追加しました。"
  when 2
    puts "全ての書籍の情報:"
    library.display_books
  when 3
    puts "プログラムを終了します。"
    exit_program = true
  else
    puts "無効な選択です。もう一度入力してください。"
  end
end

正解コードの解説

このプログラムは書籍情報を管理する「Book」クラスと、その書籍を管理する「Library」クラスを使って構成されています。

また、インプログラムでは書籍を追加したり、全ての書籍情報を表示する機能を実現しています。

プログラムをブロックごとに分解して解説します。

書籍を表すクラス:Bookクラス

class Book
  # コンストラクタで書籍のタイトル、著者、ページ数を初期化する
  def initialize(title, author, pages)
    @title = title
    @authaor = author
    @pages = pages
  end

  # 書籍の情報を表示するメソッド
  def display_info
    puts "タイトル: #{@title}, 著者: #{@authaor}, ページ数: #{@pages}"
  end
end
イニシャライザの解説
  • initializeメソッド: イニシャライザとはクラスからインスタンスを生成する際に自動的に呼び出される特別なメソッドです。このプログラムでは、title(タイトル)、author(著者)、pages(ページ数)の3つの情報を受け取り、それらをインスタンス変数@title@authaor@pagesにそれぞれ代入しています。
  • インスタンス変数: インスタンスごとに固有のデータを保持します。例えば複数の本を作成する場合、それぞれの本が異なるタイトルや著者を持てるのは、インスタンス変数を使っているからです。
その他のメソッド

display_infoメソッド: 書籍の情報を画面に表示するためのメソッドです。

putsを使ってタイトル、著者、ページ数をフォーマットして出力します。

図書館を管理するクラス:Libraryクラス

class Library
  def initialize
    @books = []
  end

  # 書籍を図書館に追加するメソッド
  def add_book(book)
    @books << book
  end

  # 全ての書籍の情報を表示するメソッド
  def display_books
    @books.each do |book|
      book.display_info
    end
  end
end
イニシャライザの解説
  • initializeメソッドLibraryクラスのイニシャライザでは書籍情報を格納するための配列@booksを初期化しています。この配列は追加された全ての書籍のデータを保持します。
その他のメソッド
  • add_bookメソッド: 引数として渡されたBookクラスのインスタンスを@books配列に追加します。<<演算子を使って配列に要素を追加する方法を学ぶことができます。
  • display_booksメソッド: 配列@booksの各要素(書籍)に対してdisplay_infoメソッドを呼び出します。これにより、全ての書籍の情報が順に表示されます。

メインプログラム

library = Library.new

exit_program = false # プログラムの終了フラグ

while !exit_program
  puts "1. 書籍を追加"
  puts "2. 全ての書籍の情報を表示"
  puts "3. 終了"
  choice = gets.chomp.to_i

  case choice
  when 1
    puts "書籍のタイトルを入力してください:"
    title = gets.chomp
    puts "著者を入力してください:"
    author = gets.chomp
    puts "ページ数を入力してください:"
    pages = gets.to_i
    book = Book.new(title, author, pages)
    library.add_book(book)
    puts "書籍を追加しました。"
  when 2
    puts "全ての書籍の情報:"
    library.display_books
  when 3
    puts "プログラムを終了します。"
    exit_program = true
  else
    puts "無効な選択です。もう一度入力してください。"
  end
end
メインプログラムの解説
  1. Library.newLibraryクラスのインスタンスを生成し、変数libraryに代入します。Libraryクラスのinitializeメソッドが自動的に呼び出されます。
  2. while !exit_program: 無限ループを作成し、exit_programtrueになるまで繰り返します。ユーザーに選択肢を表示し、入力を取得します。
  3. ユーザーの入力getsで入力を取得し、chompで余計な改行を除去しています。選択肢に応じて処理を分岐しています。
    • 選択肢1: 書籍情報を入力し、Bookクラスのインスタンスを生成。その後、libraryに追加します。
    • 選択肢2: 図書館に登録されている全ての書籍情報を表示します。
    • 選択肢3: プログラムを終了します。

まとめ

このプログラムではRubyのオブジェクト指向プログラミングの基本を学ぶことができます。

特にイニシャライザ(initializeメソッド)は、クラス設計の中心的な役割を果たしており、データの初期化を効率的に行える重要な機能です。

次のステップとして他のプログラムでイニシャライザを使ったクラスを設計し、異なるプロジェクトで応用してみましょう。

<<前のページ Ruby記事一覧 次のページ>>

この記事への質問・コメント

この記事を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    Rubyのテキスト&問題集トップへ戻る
    トップページへ戻る