属性代入メソッドの注意点

属性代入メソッドは便利なのだけれど、レシーバが付いていないと、変数への代入とみなされて、呼ばれないことになるので注意。

class Foo

  def bar=(v)
    @bar=v
  end
  attr_reader :bar

  def baz(val)
    bar = val       # ★属性代入のつもりだが、変数への代入になっている。
#    self.bar = val # ☆変数への代入とみなされないように、レシーバが必要。
  end

end

foo = Foo.new
foo.bar = 123
p foo.bar     #=> 123
foo.baz 345    
p foo.bar     #=> 123