塩焼きブログ

塩焼きに関しての研究内容を公開しています

Rubyのインスタンス変数とattr_accessor

Rubyのクラスの通常の変数はローカル変数といい、特定のメソッド内でしか利用できないが、@をつけるとインスタンス変数となり、メソッドをまたいで参照・代入ができる。

class Message

  def initialize(name)
    @name = name
  end

  def hello
    puts "Hello #{@name}"
  end

  def goodbye
    puts "Good-bye #{@name}"
  end

end
msg = Message.new("Mark")
msg.hello
msg.goodbye
# Hello Mark
# Good-bye Mark

宣言されていないインスタンス変数を参照しようとするとnilになる。

class Message

  def hello
    p @name
  end

  def goodbye
    p @name
  end

end
msg = Message.new
msg.hello
msg.goodbye
# nil
# nil

インスタンス変数は外部から参照することはできない。あくまでインスタンスメソッドからのみ利用ができる。

class Message

  def initialize(name)
    @name = name
  end

  def hello
    puts "Hello #{@name}"
  end

end
msg = Message.new("Jane")
p msg.name
# NoMethodError

しかしattr_accessorを使えば外部からインスタンス変数を参照・代入できるようになる。attr_accessorattr_readerattr_writerの両方を同時に設定する。

class Message

  attr_accessor :name

  def initialize(name)
    @name = name
  end

  def hello
    puts "Hello #{@name}"
  end

end

msg = Message.new("Jane")
msg.hello
p msg.name
msg.name = "Mark"
p msg.name
msg.hello
# Hello Jane
# "Jane"
# "Mark"
# Hello Mark

Railsのモデルでテーブルに存在しないカラムを取り扱えるようにする時などにもattr_accessorは使える。