今更だけど 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 つ以上指定します。
マニュアルもできそうに読めるのだけどな。