Forum: Ruby instance variables for Fixnum?

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Pascal H. (Guest)
on 2006-05-18 16:52
(Received via mailing list)
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
Daniel S. (Guest)
on 2006-05-18 17:13
(Received via mailing list)
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
Pascal H. (Guest)
on 2006-05-18 17:59
(Received via mailing list)
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.
This topic is locked and can not be replied to.