Instance variables for Fixnum?


#1

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


#2

Pascal H. 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


#3

Daniel S. 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.