ruby instance_variable_set はなぜ @ マークのリテラルが必要?
ruby で、 attr_reader :foo
のように、 reader のみを定義した変数に対して、
別のメソッドの中で、上の attr_reader
で用いたシンボルである :foo
を用いて、 set_variable したくなりました。
その際に、 Object#instance_variable_set
は、:foo
は引数として受け付けずに、
:@foo
とする必要があることを知りました。
obj.instance_variable_set(:foo, 1)
#=> `foo' is not allowed as an instance variable name
obj.instance_variable_set(:@foo, 1)
#=> OK
そこで生じた疑問が次です。
instance_variable_set(:foo, 1)
で @foo に bind してくれた方がシンプルな気がしたのですが、関数がこのような動作になっている、何か特別が理由があったりするのでしょうか?
というのも、今やりたいことを、今自分が持っている知識でやろうとすると、こうなりました。
class Foo
attr_reader :foo
def set_var_by_sym(sym, val)
var_sym = ('@' + sym.id2name).intern
instance_variable_set(var_sym, val)
end
end
なんというか、少し、無駄に面倒なコードになっている気がしたので。。