Operador ternario de Ruby sin otra cosa.

¿Hay un lenguaje en Ruby para “Si hacer esto” y “Hacer esto” simplemente como una orden?

por ejemplo, actualmente estoy haciendo

object.method ? a.action : nil 

para dejar la cláusula else en blanco, pero creo que probablemente haya una forma más idiomática de hacer esto que no implica tener que especificar un cero al final. (y alternativamente, siento que ocupar varias líneas de código sería un desperdicio en este caso.

 a.action if object.method? 

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 statement, por lo tanto, si desea devolver un valor, debe usar el operador ternario, que es una expresión.

En Ruby, todo es una expresión, no hay declaraciones, 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 equivalente a su vez al final if modificador forma

 a.action if object.method 

Además, dado que los operadores booleanos en Ruby no solo devuelven true o false , sino también el valor de la última expresión evaluada, puede usarlos para el flujo de control. Este es un idioma importado de Perl, y se vería así:

 object.method and a.action 

La respuesta de Greg es la mejor, pero para el registro, e incluso más que en C, las expresiones y las declaraciones son equivalentes en Ruby, así que, además de una 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 statement o expresión …

result = ( && ) ||

value = 1 result = (value == 1 && 'one' ) || 'two' result #=> 'one' value = 1 result = (value == 1 && 'one' ) || 'two' result #=> 'one' Explicar: valor == 1 && ‘uno’ # => devuelve el resultado de la última expresión, el valor es igual a 1, y se evaluará la sección, y devolverá ‘uno’.

value = 0 result = (value == 1 && 'one' ) || 'two' result #=> 'two'

Explique: valor! = 1 y ‘y’ la expresión no se evaluará, pero se utilizará instad ‘o’ expresión y devuelve ‘dos’

Otra forma en que se puede hacer en la misma línea es:

 if object.method; a.action end 

Rubocop considera que este es un mal estilo porque usa un punto y coma para terminar la expresión, pero en algunas condiciones me parece más legible que añadir la instrucción if al final. Es más fácil pasar por alto una statement if al final y no siempre quiero devolver algo si la condición no es verdadera (como lo obligan a hacerlo con un operador ternario).

También puedes ser un poco más detallado y amigable con Rubocop:

 if object.method then a.action end 
Intereting Posts