10

タプルを処理しようとしています。この場合の1つは、2つの値が等しい場合です。matchこれについて、より良い、より簡潔な方法はありますか?

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

4

3 に答える 3

22

個人的には、シンプルで直感的で、何が起こっているのかが読者にわかりやすいので、あなたのやり方は素晴らしいと思います。

ifとは言うものの、これが条項なしでそれを行うことができる1つの方法です。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 に答える