前のパートに戻る 完了して次のパートへ  

  1-6 アクセスメソッド

それではこれから、アクセスメソッドに関して学んでいきます。アクセスメソッドとは、これまでに学んだセッターやゲッターの処理をより簡潔に記述できるようにしたものです。

現在、hpoffensedefenseの3つの値を取り出すためにゲッターを使用しています。

実は、これらのゲッターは省略して記述することができます。以下のように修正してみましょう。

以下のような出力結果になればOKです。

NAME:テリー
HP:500
OFFENSE:150
DEFENSE:100

以上の結果から、attr_readerがゲッターの役割を果たすことが理解できたかと思います。また、attr_readerの部分の記述は、複数の変数に対して設定する場合、以下のように記述することもできます。

これでnamehpoffensedefenseの4つの値を取り出す記述がだいぶスッキリとしました。

それでは次に、セッターの省略形について学んでいきましょう。セッターを省略する場合はattr_writerを使用します。現在、各パラメータの値はinitializeで設定するようにしたので、セッターが存在しません。new演算子を用いてインスタンス化するときだけ値を設定したいならそれでもいいでしょう。

しかし、hpに関しては、敵からダメージを受けるたびに常に変化します。そのため、インスタンス化した後も値を書き換えられるようにする必要があります。試しに、今の状態でhpにダメージを与える処理を簡単に書いてみましょう。

そのまま実行してみてください。

$ ruby main.rb

そうすると、以下のようなエラーが表示されます。

Traceback (most recent call last):
main.rb:22:in `<main>': undefined method `hp=' for #<Brave:0x00007feba58e5538 @hp=500, @offense=150, @defense=5> (NoMethodError)
Did you mean?  hp

これは、hpに値を設定するためのhp=というメソッドがないよ、ということを示しています。つまり、今のままでは勇者にダメージを与える処理が実装できない、ということです。なので、こちらにセッターを記述しましょう。これまで学んだ知識であれば、以下のようなコードになるかと思います。

確かにこのままでもセッターとして機能するのですが、これをattr_writerを使用して以下のように短く書くこともできます。実行してエラーが出ないことを確認しましょう。

このように、attr_readerattr_writerを使えば、セッターやゲッターをかなり簡潔に定義することができます。しかし、簡潔に書く方法はこれで終わりではありません。

実は、attr_readerattr_writerを同時に定義できるメソッドがあるのです。それがattr_accessorです。こちらを使えば、attr_readerattr_writerの記述を1行で表すことができます。

今回、hpに関してはattr_readerattr_writerの両方で記述されているので、それをattr_accessorで1行にまとめましょう。(offensedefenseは書き換えられたら困るためattr_readerのみ定義)

コードを修正したら実行してエラーが出ないことを確認してください。

$ ruby main.rb

出力結果

テリーはダメージを受けた! 残りHPは470だ


「アクセサメソッド」のまとめは以下のようになります。

以上でセッター、ゲッターを簡潔に記述出来るアクセサメソッドについて学びました。勇者クラスの基本的なパラメータの定義に関しては以上になります。

議論

8 質問

このコースの評価は?