Ruby の attr_reader に対する疑問
Ruby の attr_reader メソッドを使うとインスタンス変数に読み込み専用でアクセスする事ができます。
class X def initialize @data = { filename: "test.txt" } end attr_reader :data end x = X.new x.data # OK x.data[:fname] # OK x.data = {} # ERROR
ただし、これはインスタンス変数に書き込むことができないだけで、アクセッサが返したオブジェクトは書き換えることができます。
class X def initialize @data = { filename: "test.txt" } end attr_reader :data end x = X.new x.data # OK x.data[:filename] = "foo.txt" # OK
(当たり前といえば当たり前だけど)これがすごいもにょるんですけど、いい感じに回避する方法ってないんですかね。
一応、以下のように #clone
を返すのは思いついた。
class X def initialize @data = { filename: "test.txt" } end # attr_reader :data def data @data.clone.freeze end end x = X.new x.data[:filename] = "foo.txt" # ERROR