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.