概要
Rubyのインスタンス変数(プロパティー)は、Rubyのインスタンス変数(プロパティー)は、クラス内に隠蔽(encapsulate)されていて、外部からの参照・変更はできない。
アクセスメソッドを使うことで参照・変更が可能となるが、それだけだと全くオープンになるだけなので、不適切な値への対処などを体系的に行うことができない。
getter、setterは関数定義にひと手間かかるが、インスタンス変数の参照、代入時の処理が可能となる。以下は、そのコード例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
class MyClass def initialize() @property = "Initial value" end def property puts ">>>reading property" @property end def property=(val) puts ">>>assigning prperty as '#{val}'" @property = val end end instance = MyClass.new puts instance.property instance.property = "Reviced value" puts instance.property # >>>reading property # Initial value # >>>assigning prperty as 'Reviced value' # >>>reading property # Reviced value |
getter
クラス定義内でgetterを定義する場合、インスタンス変数の名前をそのままメソッド名にして、インスタンス変数の内容を返す。プロパティーを読みだす際に特段の処理が必要な場面はあまり想定されず、アクセスメソッドで公開するのと変わらないと思われる。
1 2 3 4 |
def property puts ">>>reading property" @property end |
setter
関数名を[インスタンス変数名]=([引数])
とすることで、セッターを定義できる。セッターの中で、インスタンス変数に値をセットする。
プロパティーへの代入の場合は、その有効性のチェックなどの処理が必要な場合も想定されるので、アクセスメソッドで単に自由に代入を許すよりも、セッターで必要な処理をさせる必要がないか意識すべきと考える。
1 2 3 4 |
def property=(val) puts ">>>assigning prperty as '#{val}'" @property = val end |