2012-04-30 19 views
25

Estoy leyendo a través del excelente Ruby on Rails Tutorial y he encontrado el siguiente código.¿Por qué tratar 0 como verdadero en Ruby?

if 0 
    true 
else 
    false 
end 

Los rendimientos por encima true e ilustra cómo a diferencia de muchos idiomas (C siendo el ejemplo obvio), rubí trata 0 como true. En lugar de descartar el comportamiento como idiosincrásico, supongo que hay una buena razón para esta importante desviación de la convención. Python, por ejemplo, trata 0 como False, tal como cabría esperar.

En resumen, ¿cuál es la lógica en el diseño de ruby ​​para tratar 0 como true?

Respuesta

52

Supongo que Matz quería la simplicidad conceptual de la "veracidad" como tal: los únicos valores "falsos" son false y nil. Período.

El uso de false sería el más limpio, pero es comprensible la necesidad de incluir nil. Incluir el cero entero como un caso especial podría abrir las compuertas mentales de cuestionar la veracidad de otros tipos. ¿Qué pasa con las cadenas, es "" falso? Y matrices, ¿es [] falso? Y hash, ¿es {} falso? Ad insanitum (ver JavaScript) ...

+9

Lo que es interesante, especialmente porque estoy llegando a ruby ​​desde python, es que todos los ejemplos que mencionas ('[]', '{}' y '" "') son 'false' en python. En mi opinión, esto solo mejora la rareza de ruby. – enocom

+7

Y estoy seguro de que las personas que aprenden Python después de conocer Ruby, Perl, JavaScript, Lua (etc.) encuentran extraño que esos valores no sean ciertos. – maerics

+2

Rails introdujeron #blank ?, #present ?, #empty ?, y tal vez más porque, creo, 0, [], {} y "" no son falsos. Eso hace que el código sea más grande contra el principio de código menos ruby. – allenhwkim

10

En ruby, si existe, es cierto. Si no, es falso.

por lo tanto, con Ruby nulo (sin dirección asignada) y falso son solo falsos.

Todos los demás son verdaderos porque tiene la dirección asignada.

Pienso en esta manera; "¿Existe?"

+4

lo que dijiste no es cierto: 'nil' es un objeto, por lo que' false', y ambos existen :), son instancias de NilClass y FalseClass. los únicos valores falsos son 'falso' y' nil'. – jackdoe

+0

... es decir, * "excepto para" * 'falso' – DigitalRoss

+2

bien, sí, todo es objeto en ruby. nil es la única instancia de la clase NilClass. No creo que realmente importe porque apunta a una instancia que tiene un puntero nulo. Considero esto como "no existir". – allenhwkim

5

En Common Lisp, 0 también se trata como verdadero. Por ejemplo, el siguiente código devuelve true.

(if 0 'true 'false) 

Sin duda, Ruby sigue la misma decisión de diseño hecha en Lisp. En Lisp, solo una lista vacía (representada por nil) es falsa.

Cuestiones relacionadas