java为什么不提供一个操作符在斯卡拉
Java中有一个运算符? :
,可用于根据布尔表达式选择值。例如,表达式3 > 2 ? "true" : false
将返回字符串"true"
。我知道我们可以使用if
表达式来实现这一点,但我更喜欢这种风格,因为它简洁优雅
你可以在下面搜索框中键入要查询的问题!
Java中有一个运算符? :
,可用于根据布尔表达式选择值。例如,表达式3 > 2 ? "true" : false
将返回字符串"true"
。我知道我们可以使用if
表达式来实现这一点,但我更喜欢这种风格,因为它简洁优雅
# 1 楼答案
为了补充@Jesper所说的内容,如果您发现
if
-else
太冗长,Scalaz提供了两个更简洁的替代方案:三元布尔运算符(?
,|
)类C语言和fold
函数# 2 楼答案
按重要性的大致顺序:
1)
:
符号保留用于类型注释2)在Scala中,符号可以用作方法名和值名的标识符。标准键盘上可用的运算符数量有限,因此,如果您决定将其中两个用作关键字,则会减少可使用的运算符池(请参见脚注了解为什么必须用作关键字)
3)正如杰斯珀所说,更强大的
if
/else
已经发挥了这一作用,因此收益微乎其微4)Scala还具有模式匹配功能,它以更一般的方式与
match
关键字起到类似的作用。例如,如果表达式的计算结果不是布尔值,该怎么办5)这将增加额外的编译器复杂性。与特殊情况相比,Scala更喜欢简单性和一致性
6)这是C语言的遗留问题,也是一种非常奇怪的语法。Scala有足够多奇怪的语法
脚注: 虽然可以提出一个合理的方案来模拟
? :
作为方法(参见Ternary operator typing),但它不如关键字那样可行。当“true”和“false”选项的数字类型不同时,正确处理键入是很复杂的,operator precedence是一个问题,因为您需要的运算符优先级比其他运算符低(或者必须使用括号),并且由于实现的运行时性质,性能可能会受到影响# 3 楼答案
在Java中,
if
和? :
之间有一个区别,即if
是语句,而? :
是表达式。在Scala中,if
也是一个表达式:它返回一个值,例如,您可以将该值分配给变量Scala中的
if
比Java中的if
更像Java中的? :
:在Java中无法执行此操作:
因此,实际上没有必要在Scala中使用
? :
,因为它与if
完全相同,但使用了替代的(更模糊的)语法