Вопрос
Это беспокоило меня уже довольно давно.
>> nil.id
(irb):2: warning: Object#id will be deprecated; use Object#object_id
=> 4
Почему nil.id равен 4?(или nil.object_id, если вы хотите быть разборчивы в устаревании)
Решение
Это связано с тем, что nil — это объект, создаваемый при инициализации языка, и идентификатор этого объекта всегда равен 4.
Дополнительные сведения о том, почему идентификатор равен 4, см. этот Сообщение блога.
Другие советы
Я всегда предполагал, что это классная пасхалка:В Японии 4 – число смерти.
Это происходит потому, что идентификатор каждого объекта должен был каким-то образом быть представлен в интерпретаторе C Ruby.Числа были сопоставлены с (число*2)+1, истинность получила 0, ложность получила 2, а ноль остался 4.Это просто странная проблема реализации или дырявая абстракция.Вам не следует об этом беспокоиться, если вы не хотите написать интерпретатор Ruby.
Если вы попробуете это в irb, вы получите 4
irb
>> NIL.id
(irb):7: warning: Object#id will be deprecated; use Object#object_id
=> 4
В Ruby японцы устанавливают на ноль методы, вызов которых возвращает 4, это языковой стандарт, согласно которому они устанавливают 4 как «Опасный» ИЛИ «Смерть».