2010-02-01 16 views
67

¿Hay un rubí idioma para "If do-this" y "do-this" solo como un simple comando?Ruby ternary operator without else

por ejemplo, actualmente estoy haciendo

object.method ? a.action : nil 

para salir de la cláusula else vacía, pero siento que es probable que haya una manera más idiomática de hacer esto que no implica tener que especificar un nulo en el fin. (Y, alternativamente, me siento como ocupar varias líneas de código sería un desperdicio en este caso.

+0

Depende del contexto, pero a veces es más elegante de leer un if/while/comienzan bloque con una sola línea en el cuerpo de algo más denso/lacónico. –

Respuesta

105
a.action if object.method? 
14

respuesta de Greg es el mejor, pero para el registro, e incluso más que en C, expresiones y declaraciones son equivalentes en Ruby, por lo que además a.action if o.m? también puede hacer cosas como:

object.method? && a.action 

puede escribir (a; b; c) if d o incluso

(a 
b 
c 
) if d 

o para el mate R: (x; y; z) ? (a; b c) : (d; e; f)

No hay ninguna situación en Ruby, donde sólo se permite una sola declaración o expresión ...

131

Como regla general: que casi nunca se necesita el operador ternario en Ruby. La razón por la que lo necesita en C, es porque en C if es una declaración, por lo que si desea devolver un valor, tiene para usar el operador ternario, que es una expresión.

En Ruby, todo lo es una expresión, no son ninguna declaración, lo que hace el operador ternario más o menos superfluo. Siempre se puede sustituir

cond ? then_branch : else_branch 

con

if cond then then_branch else else_branch end 

Así, en su 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 al if modificador de forma

a.action if object.method 

Además, dado que los operadores booleanos en Ruby no sólo vuelven true o false, pero el valor de la última expresión evaluada, se pueden utilizar para el control de flujo. Este es un modismo importado de Perl, y se vería así:

object.method and a.action 
+12

¡Esta es una GRAN respuesta! –

+5

operador ternario 'cond? a: b' es más corto que 'if cond then a else b end', eso solo hace que lo use para guardar 11 caracteres ;-) – Markus

+0

[Ruby Style Guide] (https://github.com/bbatsov/ruby-style -guide # ternary-operator) indica: "Favorece al operador ternario ('?: ') sobre las construcciones' if/then/else/end'. Es más común y obviamente más conciso ". –

2

result = (<expression> && <true value>) || <false value>

value = 1 result = (value == 1 && 'one') || 'two' result #=> 'one' Explicar: valor == 1 & & 'uno' # => resultado vuelve última expresión, el valor es igual a igual 1 entonces y la sección será evaluada, y devolverá 'uno'.

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

Explicar: valor = 1 y 'y' no se evaluarán de expresión, pero instad será utilizado 'o' expresión y devuelve 'dos'

0

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

if object.method; a.action end 

Esto se considera un mal estilo de Rubocop ya que utiliza una coma para terminar la expresión, pero me resulta más fácil de leer en algunas condiciones que virar en la sentencia 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 detallado y rubocop amigable:

if object.method then a.action end