5

それぞれの前に同じガードを付けて、多くのケースステートメントを実行したいと考えています。コードの複製を必要としない方法でそれを行うことはできますか?

"something" match {
   case "a" if(variable) => println("a")
   case "b" if(variable) => println("b")
   // ...
 }
4

3 に答える 3

8

エクストラクターを作成できます。

class If {
  def unapply(s: Any) = if (variable) Some(s) else None
}
object If extends If
"something" match {
  case If("a") => println("a")
  case If("b") => println("b")
  // ...
}
于 2012-08-17T14:05:08.087 に答える
7

OR(パイプ)演算子はガードよりも優先順位が高いように思われるため、次のように機能します。

def test(s: String, v: Boolean) = s match {
   case "a" | "b" if v => true
   case _ => false
}

assert(!test("a", false))
assert( test("a", true ))
assert(!test("b", false))
assert( test("b", true ))
于 2012-08-17T14:33:45.810 に答える
4

0__の答えは良いものです。または、最初に「変数」と照合することもできます。

variable match {
  case true => s match {
    case "a" | "b" | "c" => true
    case _ => false
  }
  case _ => false
}
于 2012-08-17T14:40:55.963 に答える