Java中有一个运算符? :
,可用于根据布尔表达式选择值。例如,表达式3 > 2 ? "true" : false
将返回字符串"true"
。我知道我们可以使用if
表达式来做到这一点,但我更喜欢这种风格,因为它简洁而优雅。
答案 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是一个问题,因为你需要比其他任何东西更低优先级的运算符(否则你必须使用括号),由于实现的运行时性质,性能可能会受到影响。