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

zhu*_*zhu 12 ternary-operator kotlin

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


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


然后官方文件说:

在Kotlin中,if是一个表达式,即它返回一个值.因此没有三元运算符(condition?then:else),因为普通的if在这个角色中工作正常.

这并不能说服我.因为Kotlin支持Elvis operator哪个普通如果在那个角色也可以正常工作.

我觉得ternary operator有时候比平常更好if,不过我想知道Kotlin为什么不支持ternary operator

dis*_*han 5

ternary operator您这样使用的语言中

String value = condition ? foo : bar;
Run Code Online (Sandbox Code Playgroud)

在Kotlin中,您可以使用if和else执行相同的操作

var value = if(condition) foo else bar;
Run Code Online (Sandbox Code Playgroud)

它比ternary operator。但是Kotlin的设计师认为可以。您可以这样使用,if-else因为在Kotlin中if是一个表达式并返回一个值

Elvis operator 本质上是三元条件语句的压缩版本,等效于Kotlin中的following。

var value = if(foo != null) foo else bar;
Run Code Online (Sandbox Code Playgroud)

但是如果Elvis operator使用它可以简化如下

var value = foo ?: bar;
Run Code Online (Sandbox Code Playgroud)

这是一个很大的简化,Kotlin决定保留它。


Ron*_*Dev 2

因为if .. else ..效果很好。看一看:

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

    println("i ${ if(i == 1) "equals 1" else "not equals 1" }")
}
Run Code Online (Sandbox Code Playgroud)

  • `if-else` 在许多语言中都可以正常工作,并且它们也有三元运算符(例如,[查看 Ruby](https://gist.github.com/maxd/76e924d147d60cdc003c))。 (6认同)
  • 是的,但这是一个非常值得怀疑的论点(就像扩展方法是无用的,因为存在“实用”类,但扩展方法存在于 Kotlin 中)。除了这个论点,我看不出他们不能实现三元运算符的真正动机,因为三元运算符是像扩展方法一样的语法糖。 (2认同)