attr_accessorとは
初めまして、zooと申します。
約2ヶ月前にRubyの勉強を始めた初学者ですが、週一回を目標にRubyを中心にアウトプットしていきたいと思います。
今回はattr_accessorについてです。
Module#attr_accessor
Rubyには生成したインスタンスから直接インスタンス変数を読み書きできません。
そんなprivateなインスタンス変数の読み書きするゲッターメソッド・セッターメソッドを自動で定義してくれるメソッドです。定義をするだけなので戻り値はnil
となります
定義は、インスタンス変数名と同名のシンボルを引数とします。複数の引数がある場合はカンマで繋げます。
基本はクラス直下ですが、メソッド内でも一回呼び出せばどこで定義しても反映されます。
クラス直下ではレシーバを明示的に書かなくても自動的にクラス自身になりますが、メソッド内では明示的にレシーバを書かないとインスタンス自身をレシーバにしてしまうので注意してください。
attr_accessor :インスタンス変数名 def メソッド名 クラス名.attr_accessor :インスタンス変数名 end
具体的な使用方法
class User attr_accessor :name def initialize(name) @name = name end user = User.new('dog') user.name #=> "dog" user.name = 'cat' user.name #=> "cat"
ゲッターメソッドのみを定義するattr_reader
セッターメソッドのみを定義するattr_writer
も同じく存在します
また、attr_accessor
は以下と同義です。
class User def initialize(name) @name =name end #ゲッターメソッド #Rubyのメソッドの戻り値は最後に評価された値なので、@nameが戻り値となります def name @name end #セッターメソッド #Rubyでは=を最後につけてメソッドを定義すると、変数の代入のようにメソッドを呼び出せます。変わるのは見た目だけです。 def name=(value) @name = value end end #結果は同じ user = User.new('dog') user.name #=> "dog" user.name = 'cat' user.name #=> "cat"
Moduleクラスのサブクラスの、Classクラスのオブジェクトである新規に作成する全てのクラスがこのメソッドを使えます。
... User.class #=>Class
参考