Why the id of nil is 4 in Ruby - BigBinary Blog

Ask questions Research chat →

https://www.bigbinary.com/blog/why-the-id-of-nil-is-4-in-ruby · scraped

ruby

Attachments

Scraped Content

— 344 words · 2026-02-14 03:00:03 UTC ·

Excerpt

Following code was tested with ruby 1.8.7 and Rails 2.3 . While developing rails application you have must seen this Called id for nil, which would mistakenly be 4 — if you really wanted the id of nil, use object_id We all know that this message is added by Rails and it is called whiny nil . If you open your config/development.rb file you will see # Log error messages when you accidentally call methods on nil. config.whiny_nils = true Simply stated it means that if the application happens to invoke id on a nil object then throw an error. Rails assumes that under no circumstance a developer wants to find id of a nil object. So this must be an error case and Rails throws an exception. The question I have is why 4. Why Matz chose the id of nil to be 4. This awesome presentation on 'Ruby Internals' has the answer. In short Matz decided to have all the odd numbers reserved for numerical values. Check this out. > irb >> 0.id (irb):1: warning: Object#id will be deprecated; use Object#object_i
Following code was tested with ruby 1.8.7 and Rails 2.3 . While developing rails application you have must seen this Called id for nil, which would mistakenly be 4 — if you really wanted the id of nil, use object_id We all know that this message is added by Rails and it is called whiny nil . If you open your config/development.rb file you will see # Log error messages when you accidentally call methods on nil. config.whiny_nils = true Simply stated it means that if the application happens to invoke id on a nil object then throw an error. Rails assumes that under no circumstance a developer wants to find id of a nil object. So this must be an error case and Rails throws an exception. The question I have is why 4. Why Matz chose the id of nil to be 4. This awesome presentation on 'Ruby Internals' has the answer. In short Matz decided to have all the odd numbers reserved for numerical values. Check this out. > irb >> 0.id (irb):1: warning: Object#id will be deprecated; use Object#object_id => 1 >> 1.id (irb):2: warning: Object#id will be deprecated; use Object#object_id => 3 >> 2.id (irb):3: warning: Object#id will be deprecated; use Object#object_id => 5 >> 3.id (irb):4: warning: Object#id will be deprecated; use Object#object_id => 7 Id 1,3,5 and 7 are taken by 0,1,2 and 3. Now we are left with the id 0,2,4 and higher values. > irb > FALSE.id (irb):5: warning: Object#id will be deprecated; use Object#object_id => 0 >> TRUE.id (irb):6: warning: Object#id will be deprecated; use Object#object_id => 2 FALSE had the id 0 and TRUE has the id 2. Now the next available id left is 4 and that is taken by NIL. > irb >> NIL.id (irb):7: warning: Object#id will be deprecated; use Object#object_id => 4 We won't even be discussing this issue once 1.9 comes out where we will have to use object_id and then this won't be an issue. You can follow more discussion about this article at Hacker news .

Visibility

Visible to everyone

Reading Status

Related Bookmarks

My Note


Saved!

Annotations

Export as Markdown
+ Annotate selection

Add Annotation