为什么Kotlin不支持“三元运算符”

Why doesn't Kotlin support “ternary operator”

解释:这个问题更多的是关于Kotlin的设计意图。许多表达式语言都支持Ternary operatorif expression〔例如ruby、groovy〕。

首先,我知道groovy支持Ternary operatorElvis operator:groovy中的三元运算符。所以我不认为这是语法问题。

然后官方文件说:

In Kotlin, if is an expression, i.e. it returns a value. Therefore there is no ternary operator (condition ? then : else), because ordinary if works fine in this role.

但这并不能让我信服。因为Kotlin支持Elvis operator,如果在这个角色中工作正常的话,这也是正常的。

我认为Ternary operator有时比普通的if要好,不过我想知道为什么Kotlin不支持Ternary operator呢?


在使用ternary operator的语言中,您可以这样使用它

1
String value = condition ? foo : bar;

在科特林,你可以用if和else做同样的事情

1
var value = if(condition) foo else bar;

它比ternary operator有点冗长。但是科特林的设计师们认为这是可以的。您可以这样使用if-else,因为在kotlin if中是一个表达式并返回一个值

Elvis operator实质上是三元条件语句的压缩版本,相当于kotlin中的following。

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

但如果使用Elvis operator,则简化如下

1
var value = foo ?: bar;

这相当简单,科特林决定保留它。


因为if .. else ..工作得很好。看一看:

1
2
3
4
5
fun main(args: Array<String>) {
    var i = 2

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


三元运算符有其自身的问题,例如用大表达式很难读取。这里是我的C++项目中的一个行,其中我使用三元运算符:

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

我宁愿在这里使用一个if else表达式,因为它更加可见。

回答你的问题,我知道在科特林没有实施ternary operator的两个原因:

1)由于if else无论如何都是一个表达式,它可以代替? :

2)其他语言(C++)的经验表明,EDCOX1〔4〕引起了难以读取的代码,因此最好不要使用。