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")
Person
クラス内でinitialize
メソッドを定義しています。- このメソッドは、新しい
Person
オブジェクトが作成されるときに呼び出され、name
を受け取ります。 @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.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. プログラムの終了
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
# 書籍を表すクラス 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を活用しています。
問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。