2012-06-25 7 views
6

Ciao ho una domanda su Ruby on Railspunto interrogativo e del colon - se il resto in rubino

A quanto pare ho una dichiarazione come questa:

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

Da quello che ho letto, si dice che questo metodo ordina la colonna in base ai parametri [: ordina] e se non ci sono parametri i prodotti saranno ordinati per "nome". Tuttavia, non capisco il modo in cui questa affermazione è scritta, in particolare il secondo "?". Qualcuno può spiegarmelo ?

+2

Google "operatore ternario" –

+0

Grazie, ho trovato questo: http://en.wikipedia.org/wiki/%3F: – qusr

+0

Devo dire, mi piace molto come Ruby mi permette di collegare a catena tutto, anche se sembra strano vedere un blocco do-end in cui alla fine è collegato un metodo. – Ron

risposta

14

Questo è il tuo codice, riorganizzato per facilitare la comprensione.

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 

primo punto interrogativo è parte di un nome di metodo, la seconda - parte di operatore ternario (che si dovrebbe leggere).

4

Quella linea si traduce approssimativamente come:

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

L'? : è un operatore ternario; abbreviazione di un breve se-else.

+0

È meno una scorciatoia di una soluzione per C e altre lingue in cui 'if' è un'istruzione e non un'espressione. Tecnicamente non c'è motivo di averlo in Ruby, come dimostrato da Python e Lua. –

10

?: is a ternary operator che è presente in molte lingue. Essa ha la seguente sintassi:

expression ? value_if_true : value_if_false 

In Ruby, è una versione più breve di questo:

if expression 
    value_if_true 
else 
    value_if_false 
end 
+1

Ancora più importante, è una versione breve di questo: 'if espressione then value_if_true else value_if_false end'. IOW: puoi scrivere un'espressione 'if' su una riga, se vuoi, non devi usare l'operatore condizionale illeggibile e criptico. –

+0

@ JörgWMittag, +1 per inline 'if'-'else'. Rende il codice molto leggibile e brilla davvero rispetto a cose come 'domanda? ? vero: falso'. Lo uso sempre a meno che la linea non sia lunga. –

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

Il primo punto interrogativo è parte del nome del metodo: include?.

Il secondo punto interrogativo e il colon sono parte della operando ternario: (if this is true) ? (do this) : (else, do that).

Ciò significa che, se Product.column_names contiene params[:sort], tornerà params[:sort]. Altrimenti, restituirà "name".