Ruby練習問題4-4:共通メソッドを使ってみよう

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

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【コードの構成を見る】

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

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”を検索し、情報を表示

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

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

# 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は、クラスの属性にアクセスするための「共通メソッド」です。これにより、nameageの値を簡単に読み書きできます。

initializeメソッド(コンストラクタ)

def initialize(name, age)
  @name = name
  @age = age
end
  • initializeメソッド: クラスのインスタンスを作成するときに呼び出される特別なメソッドです。nameageを引数として受け取り、インスタンス変数@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を活用しています。

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






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