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.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
で更新された太郎のスコアを表示
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
# 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の機能で、「アクセスメソッド」を簡単に定義できます。
このメソッドを使うと、name
と score
のゲッター(値を取得するためのメソッド)とセッター(値を設定するためのメソッド)が自動的に作られます。
これにより、外部からこれらの値を直接読み取ったり変更したりすることができます。
コンストラクタでプレイヤーの初期化
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を活用しています。
問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。