2012-12-12 8 views
21

Con il rubino operatore ternario possiamo scrivere la seguente logica per un semplice if else costrutto:Ruby if .. elsIf .. else su una singola riga?

a = true ? 'a' : 'b' #=> "a" 

Ma cosa succede se volevo scrivere questo come if foo 'a' elsif bar 'b' else 'c'?

potrei lo scrivo come il seguente, ma è un po 'difficile da seguire:

foo = true 
a = foo ? 'a' : (bar ? 'b' : 'c') #=> "a" 

foo = false 
bar = true 
a = foo ? 'a' : (bar ? 'b' : 'c') #=> "b" 

Esistono opzioni migliori per la gestione di un tale scenario o è questa la nostra migliore scommessa se vogliamo condensare se. .elsif..else logic in una singola riga?

+3

Penso che il problema con la mancanza di leggibilità nella soluzione ternaria nidificata sia che la messa di tutto questo su una riga è di per sé difficile da leggere e nessuna delle soluzioni che creerai sarà molto più facile da analizzare. –

+5

In altre parole, con più esperienza imparerai che spremere più codice possibile nel più piccolo spazio possibile non è mai un obiettivo valido. –

+3

"spremere più codice possibile nel più piccolo spazio possibile non è mai un obiettivo valido." tranne nel codice macchina. –

risposta

43
a = (foo && "a" or bar && "b" or "c") 

o

a = ("a" if foo) || ("b" if bar) || "c" 
+1

Risposta di interesse, Sawa. Questo sta usando 'o' la precedenza come un trucco? – sunnyrjuneja

+2

'o' e' and' hanno un'associatività inferiore rispetto a '&&' e '||'. – sawa

+2

Amo questo ... 'e' e' or' sono amici finché si impara la precedenza, che tutti dovrebbero. –

3

È possibile anche scrivere:

x = if foo then 'a' elsif bar then 'b' else 'c' end 

Tuttavia, questa non è la formattazione idiomatica in Ruby.

5

a = if foo then 'a' elsif bar then 'b' else 'c' end

12

Il Github Ruby Styleguide raccomanda che uno liners essere riservate per banale if/else e che gli operatori ternari nidificati essere evitati. È possibile utilizzare la parola chiave then ma è considerata una cattiva pratica.

if foo then 'a' elsif bar then 'b' else 'c' end 

Si potrebbe utilizzare parte dei casi (di rubino dell'operatore interruttore) se trovare istruzioni di controllo eccessivamente complesso.

+1

'se pippo poi 'a' elsif bar poi 'b' altro 'c'' Non c'è bisogno del punto e virgola dopo barra – UsamaMan

+0

grazie per il suggerimento, modifica per rimuoverlo ora – sunnyrjuneja

+1

Ho dimenticato la fine 'dopo' c'. Dobbiamo aggiungere anche questo. – UsamaMan