Вопрос

Это беспокоило меня уже довольно давно.

>> 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 как «Опасный» ИЛИ «Смерть».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top