basyura's blog

あしたになったらほんきだす。

Ruby - attr_accessor

今更だけど attr_accessor で気持ち悪いところ。

class Hoge
  attr_accessor :attr1, :attr2, :attr3

  def initialize(map)
    attr1 = map[:attr1]
    @attr2 = map[:attr2]
    self.attr3 = map[:attr3]
  end

  def to_map
    { attr1: attr1, attr2: @attr2, attr3: self.attr3 }
  end
end

hoge = Hoge.new(attr1: "one", attr2: "two", attr3: "three")

p hoge.attr1 #=> nil
p hoge.attr2 #=> "two"
p hoge.attr3 #=> "three"

p hoge.to_map #=> {:attr1=>nil, :attr2=>"two", :attr3=>"three"}

attr_accessor で定義しているのだから attr1 = の代入はできて良さそうなのだけどできない。でも attr1 で取得することはできる。地味にハマることがある。というほど書いてないのだけどたまに書くとどうだったっけなと確認が必要になる。クラス内で扱うときは素直に @ 使えと覚えておけば良いのかな。

https://docs.ruby-lang.org/ja/2.5.0/method/Module/i/attr_accessor.html
attr_accessor(*name) -> nil[permalink][rdoc]
インスタンス変数 name に対する読み取りメソッドと書き込みメソッドの両方を 定義します。

このメソッドで定義されるメソッドの定義は以下の通りです。

def name
@name
end
def name=(val)
@name = val
end

[PARAM] name:
String または Symbol を 1 つ以上指定します。

マニュアルもできそうに読めるのだけどな。