Ruby練習問題4-1:アクセスメソッド(ゲッターとセッター)を理解しよう

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

Rubyの初心者向け問題4-1:アクセスメソッド(ゲッターとセッター)を理解しよう

この問題を解くために必要な知識:
【レベル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では「ゲッター」と「セッター」を使って、クラスの外部から安全に属性にアクセスできるようにします。

ゲッターとセッターの自動生成

Rubyには、ゲッターとセッターを簡単に定義するための便利な方法があります。それが attr_accessor というメソッドです。

これを使うと、指定した属性に対して、ゲッターとセッターの両方が自動的に生成されます。

具体例

以下は、Person クラスに name という属性を持たせ、それに対するゲッターとセッターを定義する例です。

class Person
  attr_accessor :name
end

person = Person.new
person.name = "John"  # セッターを使用して、name属性に値を設定
puts person.name      # ゲッターを使用して、name属性の値を取得

この例では、attr_accessor を使って name という属性に対するゲッターとセッターが自動的に定義されています。

これにより、person.name = "John" というコードで name に値を設定でき、puts person.name で値を取得することができます。

まとめ

Rubyのアクセスメソッドを使用することで、クラスの属性に安全にアクセスできます。

attr_accessor を使えば、ゲッターとセッターを簡単に定義でき、コードの見通しが良くなります。 ​




Ruby練習問題4-1_プレイヤー情報を管理するプログラムを作ろう

プレイヤーの名前とスコアを管理するクラスを作成しましょう。

プレイヤーの名前とスコアは外部から自由に設定できるようにし、プレイヤーの情報を表示するメソッドも用意します。

アクセスメソッドを使って、プレイヤーのスコアを更新できるようにし、更新後のスコアを表示しましょう。

この問題の要件

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

  • Player クラスを定義し、プレイヤーの名前とスコアを属性として持たせること。
  • attr_accessor を使用して、名前とスコアに対するゲッターとセッターを自動的に定義すること。
  • initialize メソッドを使用して、プレイヤーの名前とスコアを初期化すること。
  • プレイヤーの情報を表示する display_info メソッドを定義し、プレイヤーの名前とスコアを表示すること。
  • プレイヤーのスコアを更新し、更新後の情報を表示すること。

ただし、以下のような実行結果となること。

----- ↓出力される結果の例↓ -----

プレイヤー名: 太郎, スコア: 100
プレイヤー名: 花子, スコア: 200
プレイヤー名: 太郎, スコア: 150

----- ↑出力される結果の例↑ -----

この問題を解くヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

ヒント1【コードの構成を見る】

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

1.Playerクラスの定義
 1-1. attr_accessor による名前とスコアのゲッターとセッターの定義
 1-2. initializeメソッドでプレイヤーの名前とスコアを初期化
  1-2-1. @name にプレイヤーの名前を格納
  1-2-2. @score にプレイヤーのスコアを格納
 1-3. プレイヤーの情報を表示するdisplay_infoメソッド
  1-3-1. プレイヤーの名前とスコアを表示

2.Playerクラスのインスタンス生成
 2-1. player1 を “太郎” という名前と100というスコアで生成
 2-2. player2 を “花子” という名前と200というスコアで生成

3.プレイヤーの情報を表示
 3-1. player1.display_info で太郎の情報を表示
 3-2. player2.display_info で花子の情報を表示

4.プレイヤーのスコアを更新
 4-1. player1.score を150に更新

5.更新後の情報を表示
 5-1. player1.display_info で更新された太郎のスコアを表示

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

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

# Playerクラスの定義
class Player
  # ゲッターとセッターの定義
  attr_accessor :name, :score

  # コンストラクタでプレイヤーの名前とスコアを初期化
  def initialize(name, score)
=begin 【穴埋め問題1】
ここにプレイヤーの名前とスコアを初期化するコードを書いてください。
=end
  end

  # プレイヤーの情報を表示するメソッド
  def display_info
=begin 【穴埋め問題2】
ここにプレイヤーの名前とスコアを表示するコードを書いてください。
=end
  end
end

# Playerクラスのインスタンスを作成
=begin 【穴埋め問題3】
ここに2つのPlayerクラスのインスタンスを作成し、それぞれの名前とスコアを指定するコードを書いてください。
=end

# プレイヤーの情報を表示
=begin 【穴埋め問題4】
ここにそれぞれのプレイヤーの情報を表示するコードを書いてください。
=end

# プレイヤーのスコアを更新
=begin 【穴埋め問題5】
ここに太郎のスコアを150に更新するコードを書いてください。
=end

# 更新後のプレイヤーの情報を表示
=begin 【穴埋め問題6】
ここに更新後の太郎の情報を表示するコードを書いてください。
=end

 

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



解答例と解説

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

正解コードの例

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

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

# Playerクラスの定義
class Player
  # ゲッターとセッターの定義
  attr_accessor :name, :score

  # コンストラクタでプレイヤーの名前とスコアを初期化
  def initialize(name, score)
    @name = name  # プレイヤーの名前
    @score = score  # プレイヤーのスコア
  end

  # プレイヤーの情報を表示するメソッド
  def display_info
    puts "プレイヤー名: #{@name}, スコア: #{@score}"
  end
end

# Playerクラスのインスタンスを作成
player1 = Player.new("太郎", 100)
player2 = Player.new("花子", 200)

# プレイヤーの情報を表示
player1.display_info
player2.display_info

# プレイヤーのスコアを更新
player1.score = 150

# 更新後のプレイヤーの情報を表示
player1.display_info

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

コードの解説

Playerクラスの定義

ここでは、Player クラスを定義しています。このクラスは、各プレイヤーの名前とスコアを管理するためのクラスです。

attr_accessor は非常に重要なRubyの機能で、「アクセスメソッド」を簡単に定義できます。

このメソッドを使うと、namescore のゲッター(値を取得するためのメソッド)とセッター(値を設定するためのメソッド)が自動的に作られます。

これにより、外部からこれらの値を直接読み取ったり変更したりすることができます。

コンストラクタでプレイヤーの初期化

  def initialize(name, score)
    @name = name  
    @score = score  
  end

initialize メソッドは、Player クラスのインスタンスが作成されたときに呼び出され、プレイヤーの名前とスコアを初期化します。

@name@score はインスタンス変数と呼ばれ、クラスのインスタンスごとに異なる値を保持します。

プレイヤーの情報を表示するメソッド

  def display_info
    puts "プレイヤー名: #{@name}, スコア: #{@score}"
  end

display_info メソッドは、プレイヤーの名前とスコアを表示するためのメソッドです。このメソッドでは、先ほど @name@score に格納された情報を出力しています。

プレイヤーのインスタンスを作成

player1 = Player.new("太郎", 100)
player2 = Player.new("花子", 200)

ここでは、Player クラスの2つのインスタンスを作成しています。player1 は「太郎」という名前で、スコアは100点。player2 は「花子」で、スコアは200点です。

プレイヤーの情報を表示

player1.display_info
player2.display_info

これで、display_info メソッドを呼び出して、太郎と花子の情報をそれぞれ表示しています。

スコアの更新

player1.score = 150

attr_accessor で定義された「アクセスメソッド」により、player1 のスコアを直接更新することができます。このコードは、太郎のスコアを150点に変更しています。

更新後のプレイヤー情報の表示

player1.display_info

最後に、更新されたスコアを反映した太郎の情報を再度表示しています。

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

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

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

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






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