10

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

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

?

4

3 回答 3

22

就我个人而言,我认为你完成它的方式很棒,因为它简单、直观,并且对读者来说很清楚发生了什么。

也就是说,这是一种无需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!"
于 2012-09-30T21:41:09.293 回答
7

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

object Eq {
   def unapply[T](pair:(T,T)):Option[T] = 
      if (pair._1 == pair._2) Some(pair._1) else None
}

然后(4,4) match { case Eq(n) => println("same: " + n) }打印same: 4,虽然(3,4)不匹配。

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

于 2012-09-30T21:54:36.337 回答
6

您可以交换值,然后将元组与其正常的 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
于 2012-09-30T21:13:00.597 回答