Ruby練習問題3-3:コンストラクタを理解しよう

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

Rubyの初心者向け問題3-3:コンストラクタを理解しよう

この問題を解くために必要な知識:
【レベル1~2の知識】
コメントの書き方、変数と定数、基本データ型、四則演算と演算子、入力と出力、文字列操作、分岐処理(if、if~else、elsif、case)、繰り返し処理(for、while、until、each)、範囲(Range)、例外処理(begin-rescue-end)、配列(Array)、ハッシュ(Hash)、コレクション操作(配列、ハッシュの操作)、Enumerableモジュール

【レベル3の知識】
メソッドの定義と呼び出し、メソッドの戻り値、クラスの定義と使用、コンストラクタ、クラスの継承モジュールの定義と使用ミックスイン

<<前の問題 問題集Top 次の問題>>

Rubyの文法「コンストラクタ」とは

ここではコンストラクタの意味や使い方を復習します。必要ない方はここをクリックして練習問題へ飛びましょう。



Rubyでは、クラスを使ってオブジェクトを作成しますが、オブジェクトを作成する際に、その初期状態を設定する必要があります。

これを行うのが「コンストラクタ」と呼ばれる特別なメソッドです。Rubyでは、initializeという名前のメソッドがコンストラクタとして使われます。

コンストラクタの役割

コンストラクタは、オブジェクトが作られたときに自動的に呼び出され、オブジェクトの初期化(設定)を行います。

例えば、名前や年齢などの情報をオブジェクトに設定する場合、コンストラクタでその値を受け取り、オブジェクトの属性に保存します。

使用例

以下の例では、Personクラスのコンストラクタで、名前を設定しています。

class Person
  def initialize(name)
    @name = name
  end
end

# Personクラスのインスタンスを作成し、名前を設定
person = Person.new("John")
  1. Personクラス内でinitializeメソッドを定義しています。
  2. このメソッドは、新しいPersonオブジェクトが作成されるときに呼び出され、nameを受け取ります。
  3. @nameはインスタンス変数と呼ばれ、オブジェクトの内部で保持されるデータです。

まとめ

Rubyのコンストラクタは、クラスからオブジェクトを作る際に必ず呼び出され、そのオブジェクトの初期設定を行います。

これにより、オブジェクトを作成するたびに手動で設定する手間が省け、効率的なプログラミングが可能になります。




Ruby練習問題3-3:図書館の書籍情報を管理するプログラムを作ろう

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

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

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

この問題の要件

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

  • 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クラスの定義
 1-1. initializeメソッドの定義
  1-1-1. 書籍のタイトル、著者、ページ数を受け取り、インスタンス変数@title@author@pagesを初期化
 1-2. display_infoメソッドの定義
  1-2-1. インスタンス変数@title@author@pagesを表示する

2.Libraryクラスの定義
 2-1. initializeメソッドの定義
  2-1-1. 書籍のリストを格納する空の配列@booksを初期化
 2-2. add_bookメソッドの定義
  2-2-1. 引数として受け取った書籍オブジェクトを@books配列に追加
 2-3. display_booksメソッドの定義
  2-3-1. @booksに格納された全ての書籍オブジェクトのdisplay_infoメソッドを呼び出して情報を表示

3.メインプログラム
 3-1. Libraryオブジェクトを作成
 3-2. ユーザーの選択に基づいたループ処理
  3-2-1. メニュー表示
  3-2-2. 書籍の追加
   3-2-2-1. タイトル、著者、ページ数を入力し、Bookオブジェクトを作成
   3-2-2-2. その書籍をlibrary.add_bookメソッドで図書館に追加
  3-2-3. 全書籍情報の表示
   3-2-3-1. library.display_booksを呼び出して全ての書籍情報を表示
  3-2-4. プログラムの終了

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

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

# 書籍を表すクラス
class Book
  # コンストラクタで書籍のタイトル、著者、ページ数を初期化する
  def initialize(title, author, pages)
    =begin
    【穴埋め問題1】
    ここでインスタンス変数@title、@author、@pagesを初期化するコードを書いてください。
    =end
  end

  # 書籍の情報を表示するメソッド
  def display_info
    =begin
    【穴埋め問題2】
    ここで書籍のタイトル、著者、ページ数を表示するコードを書いてください。
    =end
  end
end

# 図書館を管理するクラス
class Library
  def initialize
    =begin
    【穴埋め問題3】
    ここで書籍のリストを格納する配列@booksを初期化するコードを書いてください。
    =end
  end

  # 書籍を図書館に追加するメソッド
  def add_book(book)
    =begin
    【穴埋め問題4】
    ここで書籍を@books配列に追加するコードを書いてください。
    =end
  end

  # 全ての書籍の情報を表示するメソッド
  def display_books
    =begin
    【穴埋め問題5】
    ここで@books配列の全ての書籍の情報を表示するためのループを記述してください。
    =end
  end
end

 

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



解答例と解説

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

正解コードの例

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

********************

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

  # 書籍の情報を表示するメソッド
  def display_info
    puts "タイトル: #{@title}, 著者: #{@author}, ページ数: #{@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

loop do
  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 "プログラムを終了します。"
    break
  else
    puts "無効な選択です。もう一度入力してください。"
  end
end

********************

コードの解説

このコードでは、書籍を管理するシステムを実装しています。今回は特に、コンストラクタの使い方に焦点を当てて解説します。

Bookクラスの定義とコンストラクタ

class Book
  def initialize(title, author, pages)
    @title = title
    @pages = pages
    @autor = author
  end
end

Bookクラスは書籍を表すクラスで、initializeメソッドがコンストラクタとして機能します。

コンストラクタとは、新しいオブジェクトが作成されたときに自動的に呼び出される特別なメソッドです。

このメソッドの中では、書籍の「タイトル」「著者」「ページ数」が初期化されます。

たとえば、次のように新しい書籍を作成すると、このコンストラクタが自動的に呼び出されます。

book = Book.new("Ruby入門", "山田太郎", 350)

書籍の情報を表示するメソッド

def display_info
  puts "タイトル: #{@title}, 著者: #{@author}, ページ数: #{@pages}"
end

このメソッドでは、書籍の情報を画面に表示します。

@title@author@pagesはコンストラクタで設定されたインスタンス変数で、これを使って書籍の情報を表示しています。

Libraryクラスの定義

class Library
  def initialize
    @books = []
  end
end

Libraryクラスは図書館を管理するクラスです。

このクラスでも、コンストラクタinitializeが使われており、ここでは書籍を保存するための配列@booksが初期化されています。

これにより、図書館が作成されたときに空の書籍リストが準備されます。

図書館に書籍を追加するメソッド

def add_book(book)
  @books << book
end

このメソッドは、新しい書籍を図書館のリスト@booksに追加するためのものです。<<は配列に要素を追加する演算子です。

図書館にある全ての書籍を表示するメソッド

def display_books
  @books.each do |book|
    book.display_info
  end
end

このメソッドでは、@books配列の中にある全ての書籍の情報を表示します。

eachメソッドを使って、配列内の各書籍に対してdisplay_infoメソッドを呼び出しています。

まとめ

このコードでは、コンストラクタを使ってオブジェクトの初期化を行い、その後の操作でオブジェクトのデータを利用する仕組みが学べます。

コンストラクタは、オブジェクト指向プログラミングの重要な要素であり、新しいオブジェクトを作るたびにその初期設定を自動化できる便利なメソッドです。

<<前の問題 問題集Top 次の問題>>

この問題への質問・コメント

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

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






    Ruby練習問題集へ戻る
    トップページへ戻る