2016-03-10 16 views
7

Spiega: Questa domanda riguarda maggiormente le intenzioni di progettazione di Kotlin. Molti linguaggi di espressione supportano sia Ternary operator e if expressionPerché Kotlin non supporta "operatore ternario"


Prima di tutto, lo so Groovy supporta sia Ternary operator e Elvis operator [per esempio, Ruby, Groovy.]: Ternary operator in Groovy. Quindi non penso che sia un problema di sintassi.


Poi i documenti ufficiali, ha dichiarato:

In Kotlin, se è espressione, vale a dire che restituisce un valore. Quindi non esiste un operatore ternario (condizione? Then: else), perché ordinario se funziona bene in questo ruolo.

E questo non mi convince. Perché Kotlin supporta Elvis operator che ordinario se funziona bene anche in quel ruolo.

Penso che lo ternary operator sia talvolta migliore del normale if, anche se mi chiedo perché Kotlin non supporta solo lo ternary operator?

+0

Possibile duplicato di [Operatore condizionale ternario di Kotlin] (http://stackoverflow.com/questions/16336500/kotlin-ternary-conditional-operator) –

+0

Duplicato anche del duplicato: http://stackoverflow.com/questions/ 34935918/kotlin-equivalent-of-ternary-operator –

risposta

4

Perché if .. else .. funziona correttamente. Date un'occhiata:

fun main(args: Array<String>) { 
    var i = 2 

    println("i ${ if(i == 1) "equals 1" else "not equals 1" }") 
} 
+5

'if-else' funziona bene in molte lingue e hanno anche un operatore ternario ([guarda Ruby] (https://gist.github.com/maxd/76e924d147d60cdc003c) per esempio). –

+0

Ho appena scritto che Andrey Breslav (uno degli autori di Kotlin) ha detto nelle sue presentazioni video in russo. vale a dire "se altro va bene, non c'è bisogno dell'operatore ternario" – RoninDev

+1

Giusto, ma questo è un argomento molto dubbioso (come i metodi di estensione è inutile perché esistono classi di "utilità" ma esistono metodi di estensione in Kotlin). Tranne questo argomento non vedo la vera motivazione perché non possono implementare l'operatore ternario perché gli operatori ternari sono metodi di estensione dello zucchero di sintassi. –

1

L'operatore ternario ha i suoi problemi, ad esempio è difficile da leggere con grandi espressioni. Qui è una linea dal mio progetto C++ in cui ho usato operatore ternario:

const long offset = (comm_rank > 0) ? task_size_mod + (comm_rank - 1) * task_size : 0; 

avrei preferito utilizzare un if else espressione qui dal momento che è molto più visibile.

Rispondere si mette in discussione, io sono a conoscenza di due motivi per cui ternary operator non è stato attuato in Kotlin:

1) da if else è un'espressione in ogni caso, può sostituire ? :

2) L'esperienza di altre lingue (C++) mostra che ? : provoca difficili da leggere il codice, quindi è meglio essere lasciato fuori

+3

Ecco 'if-else' invece dell'operatore ternario : 'const long offset = if (comm_rank> 0) task_size_mod + (comm_rank - 1) * task_size else 0;' - è ancora una grande espressione :) Basta usare gli operatori ternari per le condizioni semplici e 'if-else' (nella variante multilinea) in altri casi (come nel tuo caso). Inoltre, in alcuni casi l'operatore ternario ha una "leggibilità" migliore di "if-else" perché è più breve. –

+0

@maxd Se avessi 'if-else' qui lo dividerei in 4 righe. Per '? : 'è considerato un'assurdità – voddan

2

In lingue che hanno ternary operator si utilizza in questo modo

String value = condition ? foo : bar; 

In Kotlin si può fare la stessa cosa con se e gli altri

var value = if(condition) foo else bar; 

suo po 'prolisso rispetto alla ternary operator. Ma i progettisti di Kotlin hanno pensato che fosse ok. È possibile utilizzare if-else come questo perché in Kotlin if è un'espressione e restituisce un valore

Elvis operator è essenzialmente una versione compressa di istruzione condizionale ternario ed equivalente a seguire in Kotlin.

var value = if(foo != null) foo else bar; 

Ma se Elvis operator viene utilizzato lo semplificare come segue

var value = foo ?: bar; 

Si tratta di una notevole semplificazione e Kotlin deciso di tenerlo.