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

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


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


然后官方文档说:

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

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

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

【问题讨论】:

标签: ternary-operator kotlin


【解决方案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

    1. 语句:语句是一个执行的行,它不返回一个 价值。结果,语句不能位于等号的右侧 签名。
    2. 表达式:一个表达式返回一个值。所以一个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 表达式,如果你想提供很多可能的执行路径,它非常方便

      【讨论】:

        猜你喜欢
        • 2015-09-26
        • 1970-01-01
        • 2020-06-19
        • 2020-10-15
        • 1970-01-01
        • 2013-07-30
        • 2019-07-14
        • 2013-04-26
        • 2022-01-11
        相关资源
        最近更新 更多