この記事で学べる知識:イニシャライザ
この記事の練習問題を解くために必要な知識:
基礎文法、制御構造、メソッド、コレクション(レッスン1~4)、クラスの定義と使用、イニシャライザ、アクセスメソッド、attr_accessor、クラス変数とクラスメソッド、privateメソッド、正規表現、クラスの継承、ファイル操作、オーバーライド、モジュールの定義と使用、ミックスイン
<<前のページ | Ruby記事一覧 |
次のページ>> |
Rubyの「イニシャライザ」とは
ここではイニシャライザの意味や使い方を学習します。必要ない方はここをクリックして練習問題へ飛びましょう。
イニシャライザはクラスからインスタンスを生成する際に自動的に呼び出される特別なメソッドです。他の言語で「コンストラクタ」と呼ばれる機能に相当します。
Rubyではこのメソッドはinitialize
という名前で定義されます。
イニシャライザの主な役割はインスタンス変数を初期化し、インスタンスが正しく動作するための設定を行うことです。
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: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の場合、無効な選択である旨を出力
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
# 書籍を表すクラス 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
メインプログラムの解説
Library.new
:Library
クラスのインスタンスを生成し、変数library
に代入します。Library
クラスのinitialize
メソッドが自動的に呼び出されます。while !exit_program
: 無限ループを作成し、exit_program
がtrue
になるまで繰り返します。ユーザーに選択肢を表示し、入力を取得します。- ユーザーの入力:
gets
で入力を取得し、chomp
で余計な改行を除去しています。選択肢に応じて処理を分岐しています。- 選択肢1: 書籍情報を入力し、
Book
クラスのインスタンスを生成。その後、library
に追加します。 - 選択肢2: 図書館に登録されている全ての書籍情報を表示します。
- 選択肢3: プログラムを終了します。
- 選択肢1: 書籍情報を入力し、
まとめ
このプログラムではRubyのオブジェクト指向プログラミングの基本を学ぶことができます。
特にイニシャライザ(initialize
メソッド)は、クラス設計の中心的な役割を果たしており、データの初期化を効率的に行える重要な機能です。
次のステップとして他のプログラムでイニシャライザを使ったクラスを設計し、異なるプロジェクトで応用してみましょう。
<<前のページ |
Ruby記事一覧 |
次のページ>> |
この記事への質問・コメント
この記事を作成するにあたりAIを活用しています。
問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。