匹配一对相等的值

Pét*_*rök 10 scala tuples match

我正在尝试处理元组,其中一个案例是两个值相等.有没有更好的,更简洁的方式match在这方面比

(p, q) match {
  case (p, q) if (p == q) => println("Match!")
  ...
}
Run Code Online (Sandbox Code Playgroud)

dhg*_*dhg 22

就个人而言,我认为你做到这一点的方式很棒,因为它简单,直观,清晰,读者正在做什么.

也就是说,这是一种没有if条款就可以做到的方法.你可以匹配交换版本,使用反引号q变成稳定的标识符.正如@Luigi指出的,你可以检查p匹配q:

  (p, q) match {
    case (`q`, _) => println("Match!")
    ...
  }
Run Code Online (Sandbox Code Playgroud)

像这样:

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

f(1, 2)   // "No"
f(1, 1)   // "Match!"
Run Code Online (Sandbox Code Playgroud)

  • 只是`case('q',_)=>`(用于反引号的交换`'`)...不需要检查'p == q`和`q == p` (3认同)

Lan*_*dei 7

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

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

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

我在我的博客中列出了一些比较提取器(抱歉,它是德语).


kir*_*uku 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
Run Code Online (Sandbox Code Playgroud)