2009-02-16 8 views
35

Questo mi ha disturbato per un po 'di tempo.In Ruby perché nil.id restituisce 4?

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

Perché nil.id dovrebbe essere 4? (O nil.object_id se si vuole essere pignoli su deprecati)

risposta

41

Questo perché nil è un oggetto creato quando la lingua inizializza, e l'ID di quella oggetto sembra essere sempre 4.

Per ulteriori informazioni sui motivi l'id sembra essere 4, vedere il post del blog this.

+30

Sono un programmatore di Facebook Ruby e capita che 4 sia anche Mark Zuckerber ID su Facebook. Questo mi ha portato al bug più strano di sempre ... ;-) –

+0

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

+3

Questo non è vero per me il suo "8" $ IRB IRB (principale): 001: 0> nil.object_id => 8 IRB (principale): 002: 0> rubino 2.0.0p247 (2013/06/27 revisione 41674) [x86_64-darwin13.3.0] – CantGetANick

4

Succede perché l'id di ogni oggetto doveva essere in qualche modo rappresentato nell'interprete C Ruby. I numeri sono stati mappati a (numero * 2) +1, la verità ha ottenuto 0, la falsità ha ottenuto 2 e nil ne ha lasciati 4. È solo un bizzarro problema di implementazione o astrazione che perde. Non dovresti preoccuparti di questo a meno che tu non voglia scrivere un interprete Ruby.

11

Ho sempre pensato che fosse un uovo di pasqua fresco: in Giappone 4 è il numero della morte.

0

Se si sta tentando questo IRB si stanno ottenendo 4

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

In giapponese rubino persone situato sui metodi nil chiama restituisce 4 di essa la lingua standard che essi set 4 "di pericolo" o "morte"

Problemi correlati