为什么Kotlin不支持“三元操作符”
解释:这个问题更多的是关于Kotlin的设计意图。 许多表达式语言同时支持Ternary operator
和if expression
[例如, Ruby,Groovy 。]
首先,我知道Groovy支持Ternary operator
和Elvis operator
: Groovy中的三元运算符 。 所以我不认为这是一个语法问题。
然后官方文件说:
在Kotlin中,如果是一个表达式,即它返回一个值。 因此没有三元运算符(condition?then:else),因为普通的如果在这个角色中工作的很好。
这并不能说服我。 因为Kotlin支持普通的Elvis operator
在那个角色中工作得很好。
我认为ternary operator
有时比普通的好,但是我想知道为什么Kotlin不支持ternary operator
?
因为if .. else ..
工作正常。 看一看:
fun main(args: Array<String>) { 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
是一个表达式并且返回一个值
Elvis operator
本质上是一个三元条件语句的压缩版本,相当于Kotlin中的下列语句。
var value = if(foo != null) foo else bar;
但是,如果使用Elvis operator
简化如下
var value = foo ?: bar;
这是相当大的简化,Kotlin决定保留它。
三元运算符有其问题,例如很难用大的表达式来阅读。 下面是我使用三元运算符的C ++项目中的一行:
const long offset = (comm_rank > 0) ? task_size_mod + (comm_rank - 1) * task_size : 0;
我宁愿在这里使用if else
表达式,因为它更加可见。
回答你的问题,我知道为什么ternary operator
没有在Kotlin中实现的两个原因:
1)因为if else
是一个表达,它可以代替? :
? :
2)来自其他语言的经验(C ++)表明? :
? :
挑起难以阅读的代码,所以最好省略