2012-06-25 22 views
6

Hola tengo una pregunta acerca de rubí en los carrilessigno de interrogación y de colon - si los demás en rubí

Al parecer tengo una sentencia como esta:

def sort_column 
    Product.column_names.include?(params[:sort]) ? params[:sort] : "name" 
end 

Por lo que leo, se dice que este método ordene la columna basada en params [: sort] y si no hay parámetros, los productos se ordenarán por "nombre". Sin embargo, no entiendo cómo se escribe esta declaración, especialmente la segunda "?". Alguien puede explicar me lo ?

+2

Google "operador ternario" –

+0

Gracias, encontré esto: http://en.wikipedia.org/wiki/%3F: – qusr

+0

Tengo que decir, me gusta mucho cómo Ruby me permite conectarlo todo, aunque se ve extraño ver un bloque do-end donde el final tiene un método asociado. – Ron

Respuesta

14

Este es su código, reorganizado para facilitar la comprensión.

def sort_column 
    cond = Product.column_names.include?(params[:sort]) 
    cond ? params[:sort] : "name" 
    # it's equivalent to this 
    # if cond 
    # params[:sort] 
    # else 
    # 'name' 
    # end 
end 

primer signo de interrogación es parte de un nombre de método, el segundo - parte del operador ternario (que debe leer sobre).

4

Esa línea se traduce aproximadamente como:

if Product.column_names.include?(params[:sort]) 
    params[:sort] 
else 
    "name" 
end 

El? : es un operador ternario; taquigrafía para un breve if-else.

+0

Es menos una abreviatura que una solución para C y otros lenguajes donde 'if' es una declaración y no una expresión. Técnicamente, no hay razón para tenerlo en Ruby, como lo demuestran Python y Lua. –

10

?: is a ternary operator que está presente en muchos idiomas. Tiene la siguiente sintaxis:

expression ? value_if_true : value_if_false 

En Ruby, que es una versión más corta de este:

if expression 
    value_if_true 
else 
    value_if_false 
end 
+1

Más importante aún, es una versión corta de esto: 'if expression then value_if_true else value_if_false end'. IOW: puede escribir una expresión 'if' en una línea; si lo desea, no necesita usar el operador condicional horriblemente críptico e ilegible. –

+0

@ JörgWMittag, +1 para 'if'-'else' en línea. Hace que el código sea muy legible, y realmente brilla cuando se compara con cosas como '¿pregunta? ? true: falso'. Siempre lo uso a menos que la línea sea demasiado larga. –

2
Product.column_names.include?(params[:sort]) ? params[:sort] : "name" 

El primer signo de interrogación es parte del nombre del método: include?.

El segundo signo de interrogación y el colon son parte del operando ternaria: (if this is true) ? (do this) : (else, do that).

Esto significa que, si Product.column_names contiene params[:sort], volverá params[:sort]. De lo contrario, devolverá "name".

Cuestiones relacionadas