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

なんというか、少し、無駄に面倒なコードになっている気がしたので。。