unless - Ruby ternary operator sin otra cosa
conditional ruby (5)
Como regla general: casi nunca necesitas el operador ternario en Ruby. La razón por la que lo necesita en C, es porque en C if
es una instrucción, entonces si desea devolver un valor, debe usar el operador ternario, que es una expresión.
En Ruby, todo es una expresión, no hay enunciados, lo que hace que el operador ternario sea bastante superfluo. Siempre puedes reemplazar
cond ? then_branch : else_branch
con
if cond then then_branch else else_branch end
Entonces, en tu ejemplo:
object.method ? a.action : nil
es equivalente a
if object.method then a.action end
que como señala @Greg Campbell es a su vez equivalente a la forma final if
modificador
a.action if object.method
Además, como los operadores booleanos en Ruby no solo devuelven true
o false
, sino el valor de la última expresión evaluada, puede usarlos para controlar el flujo. Esta es una expresión idiomática importada de Perl, y se vería así:
object.method and a.action
¿Hay un idioma de rubí para "Si haces esto" y "hazlo" solo como un simple comando?
por ejemplo, actualmente estoy haciendo
object.method ? a.action : nil
dejar la cláusula else vacía, pero creo que probablemente haya una forma más idiomática de hacerlo que no implica tener que especificar un cero al final. (y alternativamente, siento que tomar múltiples líneas de código sería un desperdicio en este caso).
La respuesta de Greg es la mejor, pero para el registro, e incluso más que en C, las expresiones y declaraciones son equivalentes en Ruby, ¿así que además de a.action if om?
también puedes hacer cosas como:
object.method? && a.action
Puedes escribir (a; b; c) if d
o incluso
(a
b
c
) if d
o para el caso: (x; y; z) ? (a; bc) : (d; e; f)
(x; y; z) ? (a; bc) : (d; e; f)
No hay ninguna situación en Ruby donde solo se permita una sola declaración o expresión ...
Otra forma en que esto se puede hacer en la misma línea es:
if object.method; a.action end
Rubocop lo considera un estilo incorrecto porque usa un punto y coma para terminar la expresión, pero me resulta más legible en algunas condiciones que al alzar la declaración if al final. Es más fácil pasar por alto una instrucción if al final y no siempre quiero devolver algo si la condición no es verdadera (ya que se lo fuerza a un operador ternario).
También puede ser un poco más prolijo y amigable con el rubocop:
if object.method then a.action end
result = (<expression> && <true value>) || <false value>
value = 1 result = (value == 1 && ''one'' ) || ''two'' result #=> ''one''
value = 1 result = (value == 1 && ''one'' ) || ''two'' result #=> ''one''
Explica: value == 1 && ''one'' # => devuelve el resultado de la última expresión, el valor es igual a 1 y se evaluará la sección, y se devolverá ''one''.
value = 0 result = (value == 1 && ''one'' ) || ''two'' result #=> ''two''
Explique: valor! = 1 y ''y'' la expresión no se evaluará, pero instad se usará ''o'' expresión y devuelve ''dos''
a.action if object.method?