Ruby continues to surprise me.
While reading Metaprogramming Ruby this evening, I learned that there is no connection between an object’s class and its instance variables in Ruby, unlike C#. The interpreter creates instance variables on the fly, when you assign them a value.
For example, a
Task object won’t have the
state instance variable until I call the
run method on it.
class Task def run @state = :running end def stop @finished = true end end > compile = Task.new > compile.instance_variables =>  > compile.run => :running > compile.instance_variables => [:@state]
It’s possible to have objects of the same class with different instance variables.
For example, if I create another
Task object and call the
stop method, it won’t have a
@state instance variable.
> interpret = Task.new > interpret.instance_variables =>  > interpret.stop => true > interpret.instance_variables => [:@finished]