在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
  • 对于负数(小于10), Int.signumcompare输出压缩为-1对于正数(大于10)将1压缩,对于零(等于10)将0压缩为0。
  • 链接地址: http://www.djcxy.com/p/62627.html

    上一篇: Using comparison operators in Scala's pattern matching system

    下一篇: Activity can still call unbind service method. Is it normal?