2013-05-11 24 views
5

Ho appena ricevuto un bug problematico nella mia applicazione di rails e ho scoperto che il problema era che! 0 era falso. Stavo scontando che, quello dovrebbe essere vero.! 0 è false nelle guide. Perché?

Ho avuto l'impressione che! l'operatore invertirà i bit in un numero intero in modo che 0 diventi tutti gli 1 e quindi sarebbe vero.

Non è questo il caso, perché?

notare anche dalla console rotaie:

1.9.3p286 :002 > !0 
=> false 
1.9.3p286 :003 > 0 
=> 0 
1.9.3p286 :004 > !1 
=> false 
1.9.3p286 :005 > !!0 
=> true 
1.9.3p286 :006 > !0 
=> false 
1.9.3p286 :007 > !23 
=> false 
+0

Da wikipedia (http://en.wikipedia.org/wiki/Ruby_%28programming_language%29): "La valutazione booleana dei dati non booleani è rigorosa: 0," "e [] sono tutti valutati come veri. " –

+0

Dai documenti ufficiali: http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html#UF – Pigueiras

+0

L'operazione bit è irrilevante. – sawa

risposta

11

Perché 0 non è equivalente a false. 0 è un valore intero e il valore booleano di tutti gli interi è true. Le uniche cose che valutano a false sono nil e, esplicitamente, false.

Dato che 0 è true, !0 è, intuitivamente, false.

! non è un operatore bit-saggio, è un NOT logico. Forse intendevi ~0?

+1

Le spiegazioni di downvotes sarebbero apprezzate come non sono sicuro di quale parte della mia risposta sia disinformata o inappropriata. –

+0

Grazie Ant P. Non sapevo che il valore booleano di 0 fosse vero in ruby. Immagino che nel valore booleano C di 0 sia falso. –

+0

Questa risposta è fortemente fuorviante. Se '0' è equivalente a' false' è irrilevante. 'nil' non è equivalente a' false', ma è falesione. Inoltre non esiste nulla come "valore booleano di (tutti) interi", ed è anche fuorviante scrivere come se "0" sia "vero"; non è "vero", ma è vero. E 'nil' non valuta' false'; è falesia Nel complesso, la tua risposta è altamente inaccurata e fuorviante. – sawa

6

In ruby ​​ci sono solo due valori che valutano in falso nelle espressioni logiche: false e nil. Poiché 0 non è nessuno di questi, viene valutato su true e quindi! True è uguale a false.

3

Da this blog

maggior parte degli oggetti in Ruby avrà un valore booleano true. Solo due oggetti hanno un valore booleano di false, questi sono l'oggetto falso e l'oggetto nil.

Quindi qualsiasi numero intero (pari a 0) ha un valore booleano true. E quindi !0 valuta false

Problemi correlati