obj = SomeClass.new
p obj.instance_variable_defined?(:@c2) # true
p obj.instance_variable_defined?(:@d2) # false
p obj.instance_variable_defined?(:@a2) # false :-/
I was going to say that the attr_* methods don’t create instance
variables, only the methods to read/write them, as that has been my
understanding. But actually, the documentation (at least for attr_reader
and attr_accessor) says they do create instance variables.
obj = SomeClass.new
p obj.instance_variable_defined?(:@c2) # true
p obj.instance_variable_defined?(:@d2) # false
p obj.instance_variable_defined?(:@a2) # false :-/
The behavior seems correct. The “rb_attr” method in eval.c only creates
a reader method and a writer method. It cannot initialize an instance
variable since it operates at the class level, not the instance level.
In order to create the behavior you expect, the attr_* methods would
have to inject “magic” into the object initialization sequence. That is
the only way a class level method could initialize an instance variable
for every object instantiated from the class. I do not see any evidence
of such magic in the C-level “rb_attr” method.
I believe you are getting a false value correctly.
p obj.instance_variable_defined?(:@b2) # false
obj.b2 = ‘foo’
p obj.instance_variable_defined?(:@b2) # true
Since the :a2 accessor is only creating a reader, you will never be able
to create an instance variable in the normal fashion …
obj.instance_variable_set(:@a2, ‘bar’)
p obj.instance_variable_defined?(:@a2) # true
But that is an obvious example to the point of absurdity.
Blessings,
TwP
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.