为什么Kotlin不支持“三元操作符”

解释:这个问题更多的是关于Kotlin的设计意图。 许多expression式语言都支持Ternary operatorif expression [例如, Ruby,Groovy 。]


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


然后官方文件说:

在Kotlin中,如果是一个expression式,即它返回一个值。 所以没有三元运算符(condition?then:else),因为普通的如果在这个角色中工作的很好。

这并不能说服我。 因为Kotlin支持普通的Elvis operator在那个角色中工作得很好。

我认为ternary operator有时比普通的好,但是我想知道为什么Kotlin不支持ternary operator

因为if .. else ..工作正常。 看一看:

 fun main(args: Array) { var i = 2 println("i ${ if(i == 1) "equals 1" else "not equals 1" }") } 

在具有ternary operator语言中,您可以像这样使用它

 String value = condition ? foo : bar; 

在Kotlin中,你可以使用if和else来做同样的事情

 var value = if(condition) foo else bar; 

它比ternary operator有点冗长。 但是Kotlin的设计师们认为这是可以的。 你可以使用if-else像这样,因为在Kotlin中if是一个expression式并且返回一个值

Elvis operator本质上是一个三元条件语句的压缩版本,相当于Kotlin中的下列语句。

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

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

 var value = foo ?: bar; 

这是相当大的简化,Kotlin决定保留它。

三元运算符有其问题,例如很难用大的expression式来阅读。 下面是我使用三元运算符的C ++项目中的一行:

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

我宁愿在这里使用if elseexpression式,因为它更加可见。

回答你的问题,我知道为什么ternary operator没有在Kotlin中实现的两个原因:

1)因为if else是一个expression,它可以代替? : ? :

2)来自其他语言的经验(C ++)表明? : ? :挑起难以阅读的代码,所以最好省略

Interesting Posts