Rubyの初心者向け問題4-4:共通メソッドを使ってみよう
この問題を解くために必要な知識:
【レベル1~3の知識】
コメントの書き方、変数と定数、基本データ型、四則演算と演算子、入力と出力、文字列操作、分岐処理(if、if~else、elsif、case)、繰り返し処理(for、while、until、each)、範囲(Range)、例外処理(begin-rescue-end)、配列(Array)、ハッシュ(Hash)、コレクション操作(配列、ハッシュの操作)、Enumerableモジュール、メソッドの定義と呼び出し、メソッドの戻り値、クラスの定義と使用、コンストラクタ、クラスの継承、モジュールの定義と使用、ミックスイン
【レベル4の知識】
アクセスメソッド(ゲッター、セッター)、カプセル化、クラスメソッドとインスタンスメソッド、共通メソッド、ブロックとイテレータ、プロック(Proc)、ラムダ(Lambda)、ファイル操作(読み書き)、正規表現、メタプログラミングの基礎
<<前の問題 | 問題集Top |
次の問題>> |
Rubyの文法「共通メソッド」とは
ここでは共通メソッドの意味や使い方を復習します。必要ない方はここをクリックして練習問題へ飛びましょう。
Rubyの共通メソッドとは、オブジェクト指向プログラミングにおいて、多くのクラスで使用されるメソッドのことを指します。
これらは、クラスごとに異なる機能を持つメソッドですが、基本的な構造や呼び出し方は共通しています。
たとえば、Rubyではクラスを定義し、その中でメソッドを作成して使用します。
例: クラスとメソッドの基本的な使い方
次のコードは、Person
というクラスを定義し、その中にtalk
というメソッドを作成して実行する例です。
class Person def talk puts "Hello" end end person = Person.new person.talk
この例では、Person
クラスを定義し、その中にtalk
メソッドを作成しています。talk
メソッドはputs
を使って「Hello」という文字を表示します。
Person.new
で新しいオブジェクトを作成し、talk
メソッドを呼び出すと、実際に「Hello」というメッセージが出力されます。
なぜ共通メソッドが重要か?
共通メソッドは、コードの再利用性を高めるために非常に役立ちます。
たとえば、複数のオブジェクトが同じ機能を持っている場合、その機能を一度定義しておけば、各オブジェクトで簡単に利用できるようになります。
オブジェクト指向プログラミングでは、こうしたメソッドの使い回しが重要な概念です。
まとめ
- メソッドはクラス内に定義され、特定の動作を実行します。
- 共通メソッドは、複数のオブジェクト間で使いまわせるように設計されています。
- Rubyではクラスとメソッドを組み合わせることで、柔軟なプログラムを作成することができます。
これからRubyを学ぶ中で、オブジェクト指向の基礎をしっかりと理解し、メソッドの使い方に慣れていきましょう。
Ruby練習問題4-4_共通メソッドを使ってリストを管理しよう
友達の名前と年齢を管理するプログラムを作成しましょう。
このプログラムでは、友達の名前と年齢を登録し、リスト化して管理します。
また、登録された友達の中から年齢や名前を使って特定の友達を検索できるようにします。
この問題の要件
以下の要件に従ってコードを完成させてください。
Friend
クラスを作成し、友達の名前と年齢を保持する。initialize
メソッドを使って、友達の名前と年齢を設定する。- 友達の情報を整形された文字列として表示できるように、
to_s
メソッドを定義する。 - 友達の情報を格納するために、
friends
という配列を作成する。 add_friend
メソッドを定義し、友達の名前と年齢を受け取ってFriend
オブジェクトを生成し、配列に追加する。display_friends
メソッドを定義し、すべての友達の情報を表示する。search_friends_by_age
メソッドを定義し、特定の年齢以上の友達を検索して表示する。find_friend_by_name
メソッドを定義し、指定した名前の友達を検索して表示する。見つからない場合は「Friend not found.」と表示する。
ただし、以下のような実行結果となること。
----- ↓出力される結果の例↓ -----
All Friends: Name: Alice, Age: 20 Name: Bob, Age: 18 Name: Charlie, Age: 22 Friends aged 20 and above: Name: Alice, Age: 20 Name: Charlie, Age: 22 Searching for friend named 'Alice': Name: Alice, Age: 20
----- ↑出力される結果の例↑ -----
この問題を解くヒント
1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。
正解のコードは上から順に以下のような構成となっています。
1.Friendクラスの定義
1-1. attr_accessor
でnameとageのアクセサメソッドを定義
1-2. コンストラクタinitialize
で友達の名前と年齢を初期化
1-3. to_s
メソッドで友達の情報を文字列として返す
2.友達情報を格納する配列friends
の定義
3.友達情報を追加するadd_friend
メソッドの定義
3-1. Friend
オブジェクトを作成し、friends
配列に追加
4.友達情報を表示するdisplay_friends
メソッドの定義
4-1. friends
配列をループし、to_s
メソッドを使って各友達の情報を表示
5.年齢で友達を検索するsearch_friends_by_age
メソッドの定義
5-1. 年齢が指定された値以上の友達をselect
メソッドで抽出
5-2. 抽出された友達の情報をto_s
メソッドで表示
6.名前で友達を検索するfind_friend_by_name
メソッドの定義
6-1. 指定された名前の友達をfind
メソッドで検索
6-2. 該当する友達がいればto_s
メソッドで情報を表示
6-3. 該当する友達がいなければ「Friend not found.」と表示
7.友達情報を追加する処理
7-1. add_friend
メソッドで「Alice(20歳)」、「Bob(18歳)」、「Charlie(22歳)」を追加
8.すべての友達情報を表示する処理
8-1. display_friends
メソッドで全友達の情報を表示
9.年齢が20歳以上の友達を検索する処理
9-1. search_friends_by_age
メソッドで20歳以上の友達を検索し、情報を表示
10.名前が”Alice”の友達を検索する処理
10-1. find_friend_by_name
メソッドで”Alice”を検索し、情報を表示
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
# Friendクラスの定義 class Friend attr_accessor :name, :age # 初期化メソッド(コンストラクタ) def initialize(name, age) =begin 【穴埋め問題1】 ここにインスタンス変数 @name と @age に引数 name と age を代入するコードを書いてください。 =end end # 友達情報を文字列として返すメソッド def to_s =begin 【穴埋め問題2】 ここに友達の名前と年齢を文字列として返すコードを書いてください。 =end end end # 友達情報を格納する配列 friends = [] # 友達情報を追加するメソッド def add_friend(friends, name, age) =begin 【穴埋め問題3】 ここにFriendクラスの新しいインスタンスを作成し、friends配列に追加するコードを書いてください。 =end end # すべての友達情報を表示するメソッド def display_friends(friends) =begin 【穴埋め問題4】 ここにfriends配列の各友達の情報を表示するコードを書いてください。 =end end
このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。
解答例と解説
この問題の一つの正解例とそのコードの解説を以下に示します。
正解コードの例
例えば以下のようなプログラムが考えられます。
********************
# Friendクラスの定義 class Friend attr_accessor :name, :age # 初期化メソッド(コンストラクタ) def initialize(name, age) @name = name @age = age end # 友達情報を文字列として返すメソッド def to_s "Name: #{@name}, Age: #{@age}" end end # 友達情報を格納する配列 friends = [] # 友達情報を追加するメソッド def add_friend(friends, name, age) friend = Friend.new(name, age) friends << friend end # すべての友達情報を表示するメソッド def display_friends(friends) friends.each do |friend| puts friend.to_s # to_sメソッドを使用して友達情報を表示 end end # 特定の年齢以上の友達を検索するメソッド def search_friends_by_age(friends, min_age) selected_friends = friends.select { |friend| friend.age >= min_age } selected_friends.each do |friend| puts friend.to_s # to_sメソッドを使用して友達情報を表示 end end # 指定された名前の友達を検索するメソッド def find_friend_by_name(friends, name) friend = friends.find { |friend| friend.name == name } if friend puts friend.to_s # to_sメソッドを使用して友達情報を表示 else puts "Friend not found." end end # 友達情報の追加 add_friend(friends, "Alice", 20) add_friend(friends, "Bob", 18) add_friend(friends, "Charlie", 22) # すべての友達情報を表示 puts "All Friends:" display_friends(friends) # 年齢が20以上の友達を検索して表示 puts "\nFriends aged 20 and above:" search_friends_by_age(friends, 20) # 名前が"Alice"の友達を検索して表示 puts "\nSearching for friend named 'Alice':" find_friend_by_name(friends, "Alice")
********************
コードの解説
このコードは、友達の情報(名前と年齢)を管理するためのクラスを定義し、その友達をリストに追加・表示する基本的なプログラムです。
ここでは、特にRubyの「共通メソッド」を使ったクラス定義やメソッドの使い方に焦点を当てて解説します。
Friendクラスの定義
class Friend attr_accessor :name, :age
- class Friend:
Friend
というクラスを定義しています。クラスはオブジェクト指向プログラミングにおける基本要素で、オブジェクトの属性(名前や年齢)や動作(メソッド)を定義します。 - attr_accessor:
attr_accessor
は、クラスの属性にアクセスするための「共通メソッド」です。これにより、name
とage
の値を簡単に読み書きできます。
initializeメソッド(コンストラクタ)
def initialize(name, age) @name = name @age = age end
- initializeメソッド: クラスのインスタンスを作成するときに呼び出される特別なメソッドです。
name
とage
を引数として受け取り、インスタンス変数@name
と@age
にそれぞれ代入します。インスタンス変数は、オブジェクトごとに保持されるデータです。
to_sメソッド
def to_s "Name: #{@name}, Age: #{@age}" end
- to_sメソッド:
to_s
はRubyの「共通メソッド」の一つで、オブジェクトを文字列に変換する際に使用されます。この場合、友達の名前と年齢をフォーマットして返します。これにより、オブジェクトの情報をわかりやすく出力できます。
配列に友達を追加する
friends = []
- 配列friendsの定義: 複数の
Friend
オブジェクトを格納するための配列friends
を作成しています。
友達情報を追加するメソッド
def add_friend(friends, name, age) friend = Friend.new(name, age) friends << friend end
- add_friendメソッド: このメソッドは、新しい
Friend
オブジェクトを作成し、それを配列friends
に追加します。Friend.new
はクラスのインスタンスを作成する際に使用する「共通メソッド」です。
友達情報を表示するメソッド
def display_friends(friends) friends.each do |friend| puts friend.to_s end end
display_friendsメソッド: friends
配列に格納されている各友達の情報を表示します。
ここでは、to_s
メソッドを呼び出して、各友達の名前と年齢を整形して出力しています。
<<前の問題 |
問題集Top |
次の問題>> |
この問題への質問・コメント
この問題を作成するにあたりAIを活用しています。
問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。