オブジェクトと属性
外部からオブジェクトとやり取りできるように、オブジェクトの状態を及び操作するためのメソッドを定義する。オブジェクトの外部から見える側面を属性 (attribute) と呼びます。
| class Song |
||
| def name | ||
| @name | ||
| end | ||
| def artist | ||
| @artist | ||
| end | ||
| def duration | ||
| @duration | ||
| end | ||
| end | ||
この種のアクセサメソッドは頻繁に定義されるため、Rubyでは便利なショットカットを用意しています。
| class Song |
|
| attr_reader :name, :artist, :duration | |
| end |
|
ここでは、:artist は変数 artist の名前を意味し、コロンなしの artist は変数 artist の値を意味します。この例では、アクセサメソッドに、name, artist, durationという名前を付けました。対応するインスタンス変数@name, @artist, @duration は自動的に生成されます。
属性をオブジェクトの外部から設定する場合、Ruby では、等号で終わる名前を持つメソッドを作成することで、実現しています。
| class Song | ||
| def duration=(new_duration) | ||
| @duration = new_duration | ||
| end | ||
| end | ||
| song = Song.new(”さくら”, “桃太郎”, 120) song.duration → 120 |
||
| song.duration = 123 # 属性に更新された値を設定する song.duration → 123 |
||
song.duration = 123 という代入文は、song オブジェクトの duration= メソッドを呼び出し、引数として 123 を渡します。
ここでも、Rubyは、シンプルな属性設定メソッドを作成するためのショットカットを用意しています。
| class Song | ||
| attr_writer :duration | ||
| end | ||
| song = Song.new(”さくら”, “桃太郎”, 120) song.duration = 123 |
||
クラスを設計する際には、その内部状態と、内部状態が外部(つまりクラスの利用者)にどのように見えるかを決定します。内部状態はインスタンス変数として保持されます。外部状態は、属性と呼ばれるメソッドを介して外部に公開します。クラス実行可能なその他のアクション、つまり内部状態を外部に見せるという以外のアクションが通常のメソッドです。

コメント