在Scala的模式匹配系统中使用比较运算符

在Scala中使用模式匹配系统进行比较可以匹配吗? 例如:

a match { case 10 => println("ten") case _ > 10 => println("greater than ten") case _ => println("less than ten") } 

第二种情况是非法的,但我希望能够指出“何时比a大”。

你可以在模式之后添加一个警戒,即一个if和一个布尔expression式:

 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是正常的,但是如果没有实现从下面改变的风险,就不能做出这样的假设。

在我看来,解决scheme比join守卫更可读:

 (n compare 10).signum match { case -1 => "less than ten" case 0 => "ten" case 1 => "greater than ten" } 

笔记:

  • Ordered.compare返回一个负整数,如果小于这个值,则返回正数,如果Ordered.compare返回0
  • Int.signumcompare的输出压缩为负数(小于10), 1为正(大于10)或0为零(等于10)。

使用警卫:

 a match { case 10 => println("ten") case some if some > 10 => println("greater than ten") case _ => println("less than ten") }