タプルを処理しようとしています。この場合の1つは、2つの値が等しい場合です。match
これについて、より良い、より簡潔な方法はありますか?
(p, q) match {
case (p, q) if (p == q) => println("Match!")
...
}
?
個人的には、シンプルで直感的で、何が起こっているのかが読者にわかりやすいので、あなたのやり方は素晴らしいと思います。
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!"
独自のエクストラクタを定義できます。
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)
私のブログにいくつかの比較抽出機能をリストしました(申し訳ありませんが、ドイツ語です)。
値を交換してから、タプルを通常の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