From: Pascal Hurni Date: 2006-05-18T22:56:24+09:00 Subject: Re: instance variables for Fixnum? 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.