为啥 Kotlin 不支持“三元运算符”[关闭]

Posted

技术标签:

【中文标题】为啥 Kotlin 不支持“三元运算符”[关闭]【英文标题】:Why doesn't Kotlin support "ternary operator" [closed]为什么 Kotlin 不支持“三元运算符”[关闭] 【发布时间】:2016-06-24 22:55:42 【问题描述】:

说明:这个问题更多是关于 Kotlin 的设计意图。许多表达式语言同时支持Ternary operatorif expression [例如,Ruby、Groovy。]


首先,我知道 Groovy 支持Ternary operatorElvis operator:Ternary operator in Groovy。所以我认为这不是语法问题。


然后官方文档说:

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

这并不能说服我。因为 Kotlin 支持 Elvis operator,普通的 if 在该角色中也可以正常工作。

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

【问题讨论】:

Kotlin Ternary Conditional Operator的可能重复 也复制了副本:***.com/questions/34935918/… 【参考方案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中的following。

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

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

var value = foo ?: bar;

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

if-else 在许多语言中都可以正常工作,并且它们也有三元运算符(例如look at Ruby)。 我刚刚写了 Andrey Breslav(Kotlin 的作者之一)在他的俄语视频演示中所说的。即“如果其他都可以,则不需要三元运算符” 是的,但这是一个非常值得怀疑的论点(就像扩展方法是无用的,因为存在“实用程序”类但扩展方法存在于 Kotlin 中)。除了这个论点,我看不出他们为什么不能实现三元运算符的真正动机,因为三元运算符就像扩展方法一样是语法糖。 是否可以在线获取所引用的俄语视频演示文稿?如果是这样,我在哪里可以找到它们?谢谢。 我看到了这个帖子的视频habrahabr.ru/company/jugru/blog/278647我不确定其中哪个包含关于三元运算符的短语【参考方案3】:

三元运算符有它的问题,例如用大表达式很难阅读。这是我使用三元运算符的 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++) 的经验表明,? : 会引起难以阅读的代码,因此最好被排除在外

【讨论】:

这里是if-else,而不是三元运算符:const long offset = if (comm_rank &gt; 0) task_size_mod + (comm_rank - 1) * task_size else 0; - 它仍然是一个大表达式 :) 只需要对简单条件和if-else 使用三元运算符(在多行变体中)在其他情况下(如您的情况)。此外,在某些情况下,三元运算符比if-else 具有更好的“可读性”,因为它更短。 @maxd 如果我在这里有if-else,我会把它分成4行。对于? :,这被认为是无稽之谈【参考方案4】:

程序员在某些时候必须决定执行一段代码,这就是所谓的控制流If 语句是 Kotlin 中控制流程的最基本方法。需要注意的重要一点是,在 Kotlin 中,Ifexpression 而不是 statement,因为它是 Java

    语句:语句是一个执行的行,它不返回一个 价值。结果,语句不能位于等号的右侧 签名。

    表达式:一个表达式返回一个值。所以一个Kolin的结果 如果表达式可以分配给变量。

    因此,三元表达式将是多余的,并且在 Kotlin 中不存在。我们会在 Java 中编写(这是您问题的答案)

举例

Java 中的三元运算符

int 最低 = (a

Kotlin 中,我们可以使用 if 表达式编写类似的内容。

val 最低 = if(a

注意: 当 If 用作表达式时,它必须包含 else 子句。表达式在所有情况下都必须有值。

【讨论】:

【参考方案5】:

因为 if-else 是 Kotlin 中的表达式:

String check = number % 2 == 0 ? "even" : "odd" // Java

if (number % 2 == 0) "even else "odd" // Kotlin

所以 Kotlin 中没有三元运算符,而且你也可以使用 when 表达式,如果你想提供很多可能的执行路径,它非常方便

【讨论】:

以上是关于为啥 Kotlin 不支持“三元运算符”[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

kotlin中的三元运算符[重复]

Kotlin三元运算符[重复]

为啥在三元运算符中使用“0”会返回第一个值?

Kotlin 等效于三元运算符 [重复]

kotlin中的三元运算符[重复]

为啥 Swift 零合并三元运算符不返回未包装类型?