Instance variables for Fixnum?

Hi,

I'm studying ruby and tried this:

irb(main):001:0> 1.instance_variable_set(:@foo, 123)
=> 123
irb(main):002:0> 2.instance_variable_get(:@foo)
=> nil
irb(main):003:0> 1.instance_variable_get(:@foo)
=> 123

How is this possible? I thought Fixnum were 'value' type not real objects.
(in C they are VALUE which holds the value of the fixnum)

Thanx,

PHI

Pascal Hurni wrote:

irb(main):001:0> 1.instance_variable_set(:@foo, 123)
=> 123
irb(main):002:0> 2.instance_variable_get(:@foo)
=> nil
irb(main):003:0> 1.instance_variable_get(:@foo)
=> 123

How is this possible? I thought Fixnum were 'value' type not real objects.
(in C they are VALUE which holds the value of the fixnum)

Almost everything in Ruby is an object -- even Fixnums. There is only one `3' object -- it's not like a string, where two strings with the same content can very well be different objects.

   "foo".instance_variable_set(:@bar, "baz")
   "foo".instance_variable_get(:@bar) => ArgumentError

   3.instance_variable_set(:@bar, "baz")
   3.instance_variable_get(:@bar) => "baz"

This is because Fixnums are immediates; so are symbols, btw.

Daniel

Daniel Schierbeck wrote:

Almost everything in Ruby is an object -- even Fixnums. There is only
one `3' object -- it's not like a string, where two strings with the
same content can very well be different objects.

   "foo".instance_variable_set(:@bar, "baz")
   "foo".instance_variable_get(:@bar) => ArgumentError

Yes, that's ok

   3.instance_variable_set(:@bar, "baz")
   3.instance_variable_get(:@bar) => "baz"

This is because Fixnums are immediates; so are symbols, btw.

Well, I found in the ruby sources, why this is possible.

Every 'normal' object has a hashtable for instance variables, this is the
normal behaviour as we expect. But immediates don't have a hashtable,
because they are encoded as values (bits) directly in the VALUE type.

To mimic the 'object' behaviour, Matz created a 'generic_iv_tbl' which
holds the instance variables of immediates for which a 'instance_variable_set'
has been made. This is the magic.