Ask Matz: why the id of nil is 4?
blog.bigbinary.com
blog.bigbinary.com
For Ruby to know that the value in a pointer is a Fixnum (and not a pointer to an address), it will tag the first bit w/ 1 and shift the integer value by one bit. So storing the value 7 will be done like this:
(7 << 1) + 1 # => 14
This is why 7.id == 14.You can see where this is implemented right here: https://github.com/ruby/ruby/blob/trunk/include/ruby/ruby.h#...
For true, false and nil they are also stored right in the object pointer using special values defined here: https://github.com/ruby/ruby/blob/trunk/include/ruby/ruby.h#.... You'll notice that those 3 values in binary format all end with 0b...10. First bit to 1 means Fixnum, second bit to 1 means special value: true, false or nil.
(7 << 1) + 1 # => 15> tag the first bit w/ 1
I was confused with your explanation until I went and redid the binary on the original, then I got what you meant. sorry if its nitpicky. ignore if you got it.
(click on the second github link and you'll note multiple lines are highlighted. check the url for how it's done)
http://stackoverflow.com/questions/3430280/ruby-how-does-obj...
The article noted that all integers have odd ids, but not why—the LSB is a http://c2.com/cgi/wiki?TagBit in MRI. I would hope other implementations are permitted to choose different schemes; it would suck if user code began assuming nobody found a use for more than one tag bit.
irb(main):001:0» TRUE
» true
irb(main):002:0» FALSE
» false