Scala 匹配一对相等的值

Scala 匹配一对相等的值,scala,tuples,match,Scala,Tuples,Match,我试图处理一个元组,其中一种情况是两个值相等。有没有比这更好、更简洁的匹配方法 (p, q) match { case (p, q) if (p == q) => println("Match!") ... } ?您可以交换这些值,然后将元组与其普通的equals方法进行比较: scala> val t = (1, 1) t: (Int, Int) = (1,1) scala> t.swap == t res0: Boolean = true scala>

我试图处理一个元组,其中一种情况是两个值相等。有没有比这更好、更简洁的匹配方法

(p, q) match {
  case (p, q) if (p == q) => println("Match!")
  ...
}

您可以交换这些值,然后将元组与其普通的equals方法进行比较:

scala> val t = (1, 1)
t: (Int, Int) = (1,1)

scala> t.swap == t
res0: Boolean = true

scala> val t = (1, 2)
t: (Int, Int) = (1,2)

scala> t.swap == t
res1: Boolean = false

就我个人而言,我认为你这样做是很好的,因为它简单、直观,并且让读者清楚发生了什么

也就是说,这里有一种方法可以不用
if
子句来实现。您可以在交换的版本上进行匹配,使用反勾号将
q
转换为稳定的标识符。正如@Luigi所指出的,您可以检查
p
是否匹配
q

  (p, q) match {
    case (`q`, _) => println("Match!")
    ...
  }
像这样:

def f(p: Int, q: Int) {
  (p, q) match {
    case (`q`, _) => println("Match!")
    case _ => println("No")
  }
}

f(1, 2)   // "No"
f(1, 1)   // "Match!"

您可以定义自己的提取器:

object Eq {
   def unapply[T](pair:(T,T)):Option[T] = 
      if (pair._1 == pair._2) Some(pair._1) else None
}
然后
(4,4)匹配{case Eq(n)=>println(“same:+n)}
打印
same:4
,而
(3,4)
不匹配

我在我的清单中列出了一些比较提取器(对不起,它是德语的)。

只要
大小写('q',)=>
(交换
'
反勾号)就可以了。。。无需同时检查
p==q
q==p