Why doesn't Kotlin support “ternary operator”
解释:这个问题更多的是关于Kotlin的设计意图。许多表达式语言都支持Ternary operator和if expression〔例如ruby、groovy〕。
首先,我知道groovy支持Ternary operator和Elvis operator:groovy中的三元运算符。所以我不认为这是语法问题。
然后官方文件说:
In Kotlin, if is an expression, i.e. it returns a value. Therefore there is no ternary operator (condition ? then : else), because ordinary if works fine in this role.
但这并不能让我信服。因为Kotlin支持Elvis operator,如果在这个角色中工作正常的话,这也是正常的。
我认为Ternary operator有时比普通的if要好,不过我想知道为什么Kotlin不支持Ternary operator呢?
- 可能的重复ternary of kotlin条件算子
- 重复:重复stackoverflow.com also of the 34935918 /问题/ / & hellip;
在使用ternary operator的语言中,您可以这样使用它
1
| String value = condition ? foo : bar; |
在科特林,你可以用if和else做同样的事情
1
| var value = if(condition) foo else bar; |
它比ternary operator有点冗长。但是科特林的设计师们认为这是可以的。您可以这样使用if-else,因为在kotlin if中是一个表达式并返回一个值
Elvis operator实质上是三元条件语句的压缩版本,相当于kotlin中的following。
1
| var value = if(foo != null) foo else bar; |
但如果使用Elvis operator,则简化如下
这相当简单,科特林决定保留它。
因为if .. else ..工作得很好。看一看:
1 2 3 4 5
| fun main(args: Array<String>) {
var i = 2
println("i ${ if(i == 1)"equals 1" else"not equals 1" }")
} |
- if-else在许多语言中都可以很好地工作,它们也有三元运算符(例如ruby)。
- 我刚刚写了安德烈·布雷斯拉夫(科特林的作者之一)在他的俄语视频演示中所说的话。也就是说,"如果其他条件都可以,就不需要三元运算符"
- 是的,但这是一个非常可疑的论点(就像扩展方法是无用的,因为存在"实用"类,但扩展方法存在于Kotlin中)。除了这个论点,我不明白他们为什么不能实现三元运算符的真正动机,因为三元运算符是一个语法上类似于糖的扩展方法。
- 参考的俄语视频演示文稿是否在线提供?如果是,我在哪里可以找到它们?谢谢。
- 我看了这篇文章habrahabr.ru/company/jugru/blog/278647的视频,我不确定其中哪一篇包含关于三元运算符的短语
三元运算符有其自身的问题,例如用大表达式很难读取。这里是我的C++项目中的一个行,其中我使用三元运算符:
1
| const long offset = (comm_rank > 0) ? task_size_mod + (comm_rank - 1) * task_size : 0; |
我宁愿在这里使用一个if else表达式,因为它更加可见。
回答你的问题,我知道在科特林没有实施ternary operator的两个原因:
1)由于if else无论如何都是一个表达式,它可以代替? :。
2)其他语言(C++)的经验表明,EDCOX1〔4〕引起了难以读取的代码,因此最好不要使用。
- 这里是if-else,而不是三元运算符:const long offset = if (comm_rank > 0) task_size_mod + (comm_rank - 1) * task_size else 0;-它仍然是一个很大的表达式:)只需要在简单条件下使用三元运算符,在其他情况下(如您的情况)使用if-else(在多行变体中)。此外,在某些情况下,三元运算符比if-else具有更好的"可读性",因为它较短。
- @如果我有if-else,我会把它分成4行。对于? :来说,这被认为是胡说八道。