2009-02-16 16 views
35

Esto me ha estado molestando por bastante tiempo.En Ruby, ¿por qué nil.id devuelve 4?

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

¿Por qué nil.id ser 4? (O nil.object_id si quieres ser exigente con deprecations)

Respuesta

41

Esto se debe a nil es un objeto creado cuando el lenguaje se inicia, y la identificación de dicho objeto pasa a ser siempre 4.

Para obtener más información acerca de por qué el ID pasa a ser 4, ver la publicación del blog this.

+30

Soy un programador de Facebook de Ruby y resulta que 4 es también la identificación de Mark Zuckerber en Facebook. Esto me llevó al error más extraño de la historia ... ;-) –

+0

http://rxr.whitequark.org/mri/source/include/ruby/ruby.h?v=2.0.0-p481#421 – thomthom

+3

Esto no es verdad para mí es "8" $ IRB IRB (principal): 001: 0> nil.object_id => 8 IRB (principal): 002: 0> rubí 2.0.0p247 (27/06/2013 revisión 41674) [x86_64-darwin13.3.0] – CantGetANick

4

Sucede porque la identificación de cada objeto tenía que representarse de alguna manera en el intérprete de C Ruby. Los números se asignaron a (número * 2) +1, la verosimilitud obtuvo 0, la falsedad obtuvo 2 y ninguno le quedó 4. Es solo un problema de implementación extraño o una abstracción con goteras. No debe preocuparse a menos que desee escribir un intérprete de Ruby.

11

Siempre pensé que era un huevo de pascua genial: en Japón 4 es el número de muertes.

0

Si está intentando esto en IRB que está recibiendo 4

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

En las personas rubí japonesa establecidos en los métodos nil llama devuelve 4, de lenguaje estándar que establecen 4 como "peligroso" o "Muerte"

Cuestiones relacionadas