是否可以使用 Scala 中的模式匹配系统进行比较?例如:
a match {
case 10 => println("ten")
case _ > 10 => println("greater than ten")
case _ => println("less than ten")
}
第二个 case 语句是非法的,但我希望能够指定“当 a 大于时”。
是否可以使用 Scala 中的模式匹配系统进行比较?例如:
a match {
case 10 => println("ten")
case _ > 10 => println("greater than ten")
case _ => println("less than ten")
}
第二个 case 语句是非法的,但我希望能够指定“当 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 的规定与 Scala 的类似。就像 Scala当前的实现一样,分别对正值和负值使用 1 和 -1 是一种惯例,但是如果没有从底层改变实现的风险,就不能做出这样的假设。Comparable#compareTo(T)
在我看来,一个比添加警卫更具可读性的解决方案:
(n compare 10).signum match {
case -1 => "less than ten"
case 0 => "ten"
case 1 => "greater than ten"
}
笔记:
Ordered.compare
如果小于,则返回负整数,如果大于,则返回正整数,
0
如果相等。Int.signum
将输出 from 压缩compare
为-1
负数(小于 10)、1
正数(大于 10)或0
零(等于 10)。虽然以上所有答案都完美地回答了原始问题,但可以在文档https://docs.scala-lang.org/tour/pattern-matching.html中找到一些附加信息,它们不适合我的情况但是因为这个 stackoverflow 答案是谷歌中的第一个建议,所以我想发布我的答案,这是上述问题的一个极端案例。
我的问题是:
可以解释为:
答案是下面的代码示例:
def drop[A](l: List[A], n: Int): List[A] = l match {
case Nil => sys.error("drop on empty list")
case xs if n <= 0 => xs
case _ :: xs => drop(xs, n-1)
}
scala fiddle 的链接:https ://scalafiddle.io/sf/G37THif/2
如您所见,该case xs if n <= 0 => xs
语句能够将 n(函数的参数)与 guard(if) 语句一起使用。
我希望这可以帮助像我这样的人。
Scala 的模式匹配允许您定义自己的提取器。在这种情况下,您可以简单地定义一个新的提取器:
class GreaterThan(n: Int) {
def unapply(i: Int) = i > n
}
val GreaterThan10 = GreaterThan(10)
a match {
case 10 => ???
case GreaterThan10() => ???
case _ => ???
}
或者只使用模式防护。