2016-03-10 103 views
7

解釋:這個問題更多的是關於Kotlin的設計意圖。許多表達語言支持Ternary operatorif expression爲什麼Kotlin不支持「三元運算符」


首先,我知道Groovy的支持Ternary operatorElvis operator [例如,紅寶石,Groovy的]:Ternary operator in Groovy。所以我不認爲這是一個語法問題。


然後正式文件表示:

在科特林,如果是一個表達式,即它返回一個值。因此沒有三元運算符(條件?然後:else),因爲普通的if在這個角色中工作正常。

而這並不能說服我。因爲Kotlin支持普通的Elvis operator如果在那個角色中工作得很好。

我認爲ternary operator有時比普通if更好,但我不知道爲什麼Kotlin不支持ternary operator

+0

[Kotlin三元條件運算符]的可能重複(http://stackoverflow.com/questions/16336500/kotlin-ternary-conditional-operator) –

+0

重複的副本:http://stackoverflow.com/questions/ 34935918/kotlin相當於三元運算符 –

回答

4

因爲if .. else ..工作正常。請看:

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

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

'if-else'在許多語言中運行正常,並且它們也有三元運算符([看看Ruby](https://gist.github.com/maxd/76e924d147d60cdc003c))例)。 –

+0

我剛纔寫道,安德烈佈雷斯拉夫(Kotlin的作者之一)在他的視頻介紹中用俄語說道。即「如果其他條件好,沒有三元運算符的需求」 – RoninDev

+1

正確,但這是非常可疑的論點(就像擴展方法是無用的,因爲存在「實用程序」類,但擴展方法存在於Kotlin中)。除了這個論點之外,我沒有看到爲什麼他們不能實現三元運算符的真正動機,因爲三元運算符是一種類似於擴展方法的語法糖。 –

1

三元操作符有它的問題,例如,它是很難與大表達式讀取。這裏是我的C++項目中的線,我用三元運算符:

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

我寧願在這裏使用的if else表達,因爲它是如此的更加明顯。

回答你的問題,我所知道的兩個原因ternary operator不是在科特林實施:

1)由於if else是一種表達,無論如何,它可以代替? :

2)從其他語言的經驗( C++)表明,? :引發難以閱讀的代碼,所以最好是被排除在外

+3

這裏是'if-else'而不是三元運算符:'const long offset = if(comm_rank> 0)task_size_mod +(comm_rank - 1)* task_size else 0;' - 它仍然是一個很大的表達式:)只需要使用三元運算符來處理簡單條件和'if-else'在多線變體)在其他情況下(如你的情況)。此外,在某些情況下,三元運算符比「if-else」具有更好的「可讀性」,因爲它更短。 –

+0

@maxd如果我在這裏有'if-else',我會把它分成4行。對於? :「這被認爲是無稽之談 – voddan

2

在具有語言ternary operator你使用這樣

String value = condition ? foo : bar; 

在科特林您可以使用if和else

var value = if(condition) foo else bar; 

其位比ternary operator詳細做同樣的事情。但是Kotlin的設計師認爲它沒問題。您可以使用if-else喜歡這樣,因爲在科特林if是一個表達式,並返回一個值

Elvis operator基本上是三元條件語句和壓縮版本相當於科特林以下。

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

但如果Elvis operator使用它簡化如下

var value = foo ?: bar; 

這是相當大的簡化和科特林決定保留它。

相關問題