爱国者*_*爱国者 15 java scala operator-keyword
? :Java中有一个运算符,可用于根据布尔表达式选择值.例如,表达式3 > 2 ? "true" : false将返回一个字符串"true".我知道我们可以使用if表达式来做到这一点,但我更喜欢这种风格,因为它简洁而优雅.
Jes*_*per 57
在Java中,存在的差异if及? :的,那就是if一个说法,同时? :是一个表达式.在Scala中,if也是一个表达式:它返回一个值,您可以将其分配给变量.
在ifScala中更像是? :在Java中比if在Java中:
// In Scala 'if' returns a value that can be assigned to a variable
val result = if (3 > 2) "yes" else "no"
Run Code Online (Sandbox Code Playgroud)
你不能用Java做到这一点:
// Illegal in Java, because 'if' is a statement, not an expression
String result = if (3 > 2) "yes" else "no"
Run Code Online (Sandbox Code Playgroud)
因此,实际上没有必要? :在Scala中使用它,因为它与完全相同if,但具有替代(更加模糊)的语法.
mis*_*tor 14
要添加到@Jesper所说的内容,如果你发现if- 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
Run Code Online (Sandbox Code Playgroud)
按重要性顺序排列:
1):符号保留用于类型注释
2)在Scala中,符号可以用作方法和值名称的标识符.标准键盘上只有有限数量的这些可用,因此如果您决定将其中两个用于关键字,那么您将减少可以使用的运算符池(请参阅脚注,了解为什么它们必须是关键字)
3)正如Jesper所说,更强大if/ else已经完成这个角色,所以收益是微不足道的
4)Scala还具有模式匹配,其以match更一般的方式履行与关键字类似的角色.例如,如果你的表达式求值为不是布尔值的东西怎么办?
5)它会增加额外的编译器复杂性.Scala更喜欢简单和均匀的特殊情况
6)这是C的宿醉,实际上是一种奇怪的语法.Scala有足够奇怪的语法
脚注:虽然有可能提出一个合理的方案来模拟? :方法(参见三元运算符输入),但它不像关键字那样可行.当"true"和"false"替代品具有不同的数字类型时,处理正确的输入很复杂,运算符优先级是一个问题,因为您需要优先级低于其他任何操作符的运算符(或者您必须使用括号),以及由于实现的运行时性质,性能可能会受到影响.