##アクセスメソッド
- Rubyではオブジェクトの外部からインスタンス変数を直接参照したり、インスタンス変数に代入したりすることができない。
- オブジェクトの内部の情報にアクセスするには、そのためのメソッドを定義する必要がある。
ruby
class Helloworld
def initialize(myname)
@name = myname
end
def name #@nameを参照する (最初のメソッド)
@name
end
def name=(value) #@nameを変更する(2番目のメソッド)
@name = value
end
end
bob = Helloworld.new("Bob")
p bob.name # => "Bob"
p bob.name = "Robert" # => "Robert"
- 最初のメソッドnameは単に、@nameの値を返す。このメソッドは「属性」を参照しているかのように利用できる。
- 2番目のメソッドはname=という名前を持っている。
2.について
ruby
p bob.name = "Robert" # => "Robert"
一見、オブジェクトの属性のようなものに代入を行っているように見える、この文は実際はname=("Robert")というメソッド呼び出しを行っている。
このようなメソッドを用意すれば、インスタンス変数に外部からアクセスを許すことができるようになる。
しかし、インスタンス変数が幾つもある場合には何度もメソッドを定義するのは面倒かつ見つかりにくいミスが入り込みやすくなる。
そこで、これらのメソッドを簡単に定義するために用意されているのが以下。
- attr_reader
- attr_writer
- attr_accessor
インスタンス変数名を示すシンボルを指定すると、同名のアクセスメソッドを自動的に定義してくれる。
アクセスメソッドの定義
定義 | 意味 |
---|---|
attr_reader | 参照のみ可能にする(nameメソッドを定義する) |
attr_writer | 変更のみ可能にする(name=メソッドを定義する) |
attr_accessor | 参照と変更の両方を可能にする(上記2つを定義) |
先ほどのnameメソッドとname=メソッド定義する代わりに次のように一行書けば同じ意味になる。
class Helloworld
attr_accessor :name
.
.
.
end
<メモ>
インスタンス変数を設定するメソッドをライター、参照するメソッドをリーダーと呼ぶ。
これらのメソッドを合わせてアクセサーと呼ぶ。
リーダーのことをゲッター、ライターをセッター、アクセサーのことをアクセスメソッドということもある。