为什么不提供运营商? :在斯卡拉

时间:2011-11-23 06:37:26

标签: java scala operator-keyword

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

3 个答案:

答案 0 :(得分:57)

在Java中,if? :之间存在差异,即if语句? :是< EM>表达。在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完全相同,但使用其他(更加模糊的)语法。

答案 1 :(得分:14)

要添加@Jesper所说的内容,如果发现if - else过于冗长,Scalaz会提供两个更多的替代方案:三元布尔运算符(?,{{1} })类似C语言,|函数。

fold

答案 2 :(得分:7)

按重要性排序:

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

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

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

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

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

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


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