プログラミング学習メモ

RubyとRuby on Rails等

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

参考

プロを目指す人のためのRuby入門
Rubyリファレンス(attr_accessor)