为什么不提供运营商? :在scala中

有一个运营商? : ? :在Java中,可用于根据布尔表达式选择值。 例如,表达式3 > 2 ? "true" : false 3 > 2 ? "true" : false将返回一个字符串"true" 。 我知道我们可以使用if表达式来做到这一点,但我更喜欢这种风格,因为它简洁而优雅。

在Java中, if? :之间存在差异? : ? :那就是说, if是一个陈述 ? : ? :是一个表达 。 在Scala中, if也是一个表达式 :它返回一个值,您可以将其分配给变量。

Scala中的if更像是? : ? :在Java中比在Java中的if

 // In Scala 'if' returns a value that can be assigned to a variable val result = if (3 > 2) "yes" else "no" 

你不能用Java做到这一点:

 // Illegal in Java, because 'if' is a statement, not an expression String result = if (3 > 2) "yes" else "no" 

那么,真的没有必要? : ? :在Scala中,因为它与if完全相同,但使用替代(更加模糊)的语法。

要添加@Jesper所说的内容,如果你发现 – else太冗长,Scalaz提供了两个更多的替代方案:三元布尔运算符( ?| ),类似C语言和fold函数。

 scala> import scalaz._ import scalaz._ scala> import Scalaz._ import Scalaz._ scala> (3 > 2) ? "True" | "False" res59: java.lang.String = True scala> (3 > 2).fold("True", "False") res60: java.lang.String = True 

按重要性排序:

1) :符号保留用于类型注释

2)在Scala中,符号可以用作方法和值名称的标识符。 标准键盘上只有有限数量的这些可用,因此如果您决定将其中两个放入关键字中,那么您将减少可以使用的运算符池(请参阅脚注,了解为什么它们必须是关键字)

3)正如Jesper所说,更强大的if / else已经完成了这个角色,所以收益是微不足道的

4)Scala还具有模式匹配,其以更一般的方式与match关键字一起履行类似的角色。 例如,如果你的表达式求值为不是布尔值的东西怎么办?

5)它会增加额外的编译器复杂性。 Scala更喜欢简单和统一的特殊情况

6)这是C的宿醉,实际上是一种奇怪的语法。 Scala有足够奇怪的语法


脚注:虽然有可能提出一个合理的模拟方案? : ? :作为方法(参见三元运算符输入 ),它不像关键字那样可行。 当“true”和“false”替代品具有不同的数字类型时,处理正确的输入很复杂, 运算符优先级是一个问题,因为您需要优先级低于其他任何操作符的运算符(或者您必须使用括号),以及由于实现的运行时性质,性能可能会受到影响。