首页 文章

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

提问于
浏览
8

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


首先,我知道Groovy同时支持 Ternary operatorElvis operatorTernary operator in Groovy . 所以我没有't think it'的语法问题 .


然后官方文件说:

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

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

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

3 回答

  • 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决定保留它 .

  • 4

    三元运算符有它的问题,例如很难用大表达式阅读 . 这是我的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)表明 ? : 会激发难以阅读的代码,因此最好不要使用

  • 4

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

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

相关问题