В Ruby почему nil.id возвращает 4? - PullRequest
35 голосов
/ 16 февраля 2009

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

>> nil.id
(irb):2: warning: Object#id will be deprecated; use Object#object_id
=> 4

Почему nil.id будет 4? (или nil.object_id, если вы хотите быть разборчивыми в отношении устареваний)

Ответы [ 4 ]

41 голосов
/ 16 февраля 2009

Это потому, что nil - это объект, созданный при инициализации языка, и идентификатор этого объекта всегда равен 4.

Для получения дополнительной информации о том, почему идентификатор равен 4, см. это сообщение в блоге.

11 голосов
/ 18 февраля 2009

Я всегда предполагал, что это было классное пасхальное яйцо: в Японии 4 - число смертей.

4 голосов
/ 16 февраля 2009

Это происходит потому, что идентификатор каждого объекта должен был каким-то образом быть представлен в интерпретаторе C Ruby. Числа сопоставлены (число * 2) +1, правдивость - 0, ложность - 2, а ноль - 4. Это просто странная проблема реализации или утечка абстракции. Вам не стоит беспокоиться об этом, если вы не хотите писать интерпретатор Ruby.

0 голосов
/ 02 мая 2013

Если вы попробуете это в IRB, вы получите 4

irb
>> NIL.id
(irb):7: warning: Object#id will be deprecated; use Object#object_id
=> 4

В ruby ​​японцы, для которых заданы nil-методы, они возвращают 4, это языковой стандарт, в котором они устанавливают 4 как «опасный» ИЛИ «смерть»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...