2012-10-03 35 views
11

nil || false devuelve false y false || nil devuelve nil. ¿Alguien tiene una explicación para esto?nil || falso y falso || nil en ruby ​​

+0

Para obtener puntos de bonificación, explica por qué 'nil || falso y falso || nil' evalúa como falso – pguardiario

+0

@pguardiario http://stackoverflow.com/questions/1840488/operator-precedence-for-and-in-ruby – x1a4

Respuesta

16

En Ruby, todo es una expresión, y una expresión devolverá el último valor evaluado dentro de ella.

Para ambos ejemplos, el lado izquierdo de la expresión || evalúa a un valor falso, por lo que Ruby luego evalúa el lado derecho y lo devuelve.

+0

Su explicación es muy clara, ¡gracias! – user1538814

3

|| devuelve el resultado de la última expresión evaluada. Si evalúa el LHS y encuentra un valor true, obtiene el LHS; de lo contrario, obtienes el RHS (no importa lo que ese RHS pueda ser).

+0

¡Esa fue una muy buena explicación, gracias! – user1538814

4

Como los otros señalaron, || primero evalúa la expresión de la izquierda. Si es "verdadero" (cualquier cosa excepto false o nil), lo devuelve. De lo contrario, evalúa la expresión de la derecha y la devuelve (sin importar de qué se trate).

Esto hace que || para más que simplemente pruebas booleanas. Por ejemplo, acabo de utilizar el otro día al escribir algo de código para el chronic joya:

@now = options[:now] || Chronic.time_class.now 

Eso quiere decir: "si el options de hash incluye un valor :now, tienda que en @now De lo contrario, caer de nuevo en Chronic.time_class.now. como predeterminado ". Estoy seguro de que puedes pensar en muchas aplicaciones posibles en tus propios programas.

&& es análogo: primero evalúa la expresión de la izquierda, y si se evalúa como false o nil, lo devuelve. De lo contrario, evalúa la expresión de la derecha y la devuelve (sin importar de qué se trate).

Esto significa && es también es útil para mucho más que simplemente pruebas booleanas. Puedes usarlo para exprimir dos líneas de código en una. Por ejemplo:

do_something && do_something_else 

(Eso sólo funciona si usted sabe que el valor de retorno de do_something nunca será false o nil!)

También puede utilizar && para exprimir una expresión "guardia" en el mismo línea como lo que es "guarda":

message && send_message(message) 

que podría sustituir:

unless message.nil? 
    send_message(message) 
end 
+0

Todavía estoy aprendiendo ruby, pero esto es realmente útil. – user1538814