在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.signum
将compare
的输出压缩为负数(小于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") }