在Scala的模式匹配系统中使用比较运算符
使用Scala中的模式匹配系统进行比较可以匹配吗? 例如:
a match {
case 10 => println("ten")
case _ > 10 => println("greater than ten")
case _ => println("less than ten")
}
第二种情况说明是非法的,但我希望能够指出“何时a大于”。
你可以在模式之后添加一个警戒,即一个if
和一个布尔表达式:
a match {
case 10 => println("ten")
case x if x > 10 => println("greater than ten")
case _ => println("less than ten")
}
编辑:请注意,这与表达式不同于在=>
后放置if
,因为如果警卫不真实,则模式不匹配。
作为问题精神的一个无法回答的问题,该问题询问如何将谓词合并到匹配子句中,在这种情况下谓词可以在match
之前排除:
def assess(n: Int) {
println(
n compare 10 match {
case 0 => "ten"
case 1 => "greater than ten"
case -1 => "less than ten"
})
}
现在, scala.math.Ordering.compare(T, T)
的文档只承诺不等于结果将会大于或小于零。 Java的Comparable#compareTo(T)
与Scala类似。 正如Scala当前的实现那样,正常值和负值分别使用1和-1是正常的,但是如果没有实现从下面改变的风险,就不能做出这样的假设。
在我看来,解决方案比加入守卫更可读:
(n compare 10).signum match {
case -1 => "less than ten"
case 0 => "ten"
case 1 => "greater than ten"
}
笔记:
Ordered.compare
返回一个负整数,如果小于该值,则返回正数,如果Ordered.compare
返回0
。 Int.signum
将compare
输出压缩为-1
对于正数(大于10)将1
压缩,对于零(等于10)将0
压缩为0。 上一篇: Using comparison operators in Scala's pattern matching system
下一篇: Activity can still call unbind service method. Is it normal?