概要
Rubyのインスタンス変数(プロパティー)は、クラス内に隠蔽(encapsulate)されていて、外部からの参照・変更はできないが、アクセスメソッドを使うことで、外部からの参照・変更が可能となる。
attr_reader
attr_reader
メソッドを定義すると、そのインスタンス変数を直接参照できるようになる。ただし値のセットはできない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class MyClass2 attr_reader :a def initialize() @a = 0 end end instance = MyClass2.new puts instance.a # 0 instance.a = 1 # ERROR # in `<main>': undefined method `a=' for #<MyClass2:0x0000000005189b88 @a=0> (NoMethodError) |
attr_writer
attr_writer
メソッドを定義すると、そのインスタンス変数に直接値をセットできるようになる。ただし参照はできない。
1 2 3 4 5 6 7 8 9 10 11 |
class MyClass3 attr_writer :a end instance = MyClass3.new instance.a = 1 puts instance.a # ERROR # in `<main>': undefined method `a' for #<MyClass3:0x00000000050230f0 @a=1> (NoMethodError) |
attr_accessor
attr_accessor
メソッドを定義すると、そのインスタンス変数の読み書きが直接できるようになる。
1 2 3 4 5 6 7 8 9 |
class MyClass4 attr_accessor :a end instance = MyClass4.new instance.a = 1 puts instance.a # 1 |
無定義での利用
各アクセスメソッドは、initialize()
などでインスタンス変数に対してオブジェクトの実態を定義しなくても機能する。ただし無定義のままではnil
のままなので、利用時にエラーとなることがある。
initialize()
などで明示的に定義するのが望ましい。
1 2 3 4 5 6 7 8 9 10 |
class MyClass attr_reader :a end instance = MyClass.new p instance.a a += 1 # nil # in `<main>': undefined method `+' for nil:NilClass (NoMethodError) |
複数定義
各アクセスメソッドで','
で区切って複数のシンボルを並べることができる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class Person attr_reader :first_name, :last_name def initialize() @first_name = "John" @last_name = "Doe" end end person = Person.new puts person.first_name puts person.last_name # John # Doe |