为啥 Kotlin 不支持“三元运算符”[关闭]
Posted
技术标签:
【中文标题】为啥 Kotlin 不支持“三元运算符”[关闭]【英文标题】:Why doesn't Kotlin support "ternary operator" [closed]为什么 Kotlin 不支持“三元运算符”[关闭] 【发布时间】:2016-06-24 22:55:42 【问题描述】:说明:这个问题更多是关于 Kotlin 的设计意图。许多表达式语言同时支持Ternary operator
和if expression
[例如,Ruby、Groovy。]
首先,我知道 Groovy 支持Ternary operator
和Elvis 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 > 0) task_size_mod + (comm_rank - 1) * task_size else 0;
- 它仍然是一个大表达式 :) 只需要对简单条件和if-else
使用三元运算符(在多行变体中)在其他情况下(如您的情况)。此外,在某些情况下,三元运算符比if-else
具有更好的“可读性”,因为它更短。
@maxd 如果我在这里有if-else
,我会把它分成4行。对于? :
,这被认为是无稽之谈【参考方案4】:
程序员在某些时候必须决定执行一段代码,这就是所谓的控制流。 If 语句是 Kotlin 中控制流程的最基本方法。需要注意的重要一点是,在 Kotlin 中,If 是 expression 而不是 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 不支持“三元运算符”[关闭]的主要内容,如果未能解决你的问题,请参考以下文章