標準的なパターンマッチングは、ちょうど1つの場合に常に一致します。
class MatchAll[S](scrutinee : =>S) {
def matchAll[R](patterns : PartialFunction[S,R]*) : Seq[R] = {
val evald : S = scrutinee
patterns.flatMap(_.lift(evald))
}
}
implicit def anyToMatchAll[S](scrut : =>S) : MatchAll[S] = new MatchAll[S](scrut)
def testAll(x : Int) : Seq[String] = x matchAll (
{ case 2 => "two" },
{ case x if x % 2 == 0 => "even" },
{ case x if x % 2 == 1 => "neither" }
)
println(testAll(42).mkString(",")) // prints 'even'
println(testAll(2).mkString(",")) // prints 'two,even'
println(testAll(1).mkString(",")) // prints 'neither'
:あなたはパターンが部分関数として扱うことができるという事実を利用して近くにあなたが欲しいものを得ることができるといえ、独自のマッチング演算子を定義することによって(
Language Specification、セクション8.5、
無名関数パターンマッチングを参照してください)
シンタックスは通常通りですが、私にとっては、このような構造はScalaの威力を証明しています。
あなたの例は、現在のように書かれ
:(編集huynhjlは、彼がthis questionに驚くほど似た答えを与えたことを指摘した。)
可能重複[マッチ「フォールスルー」:?複数のケースのためのコードの同じ部分を実行します](http://stackoverflow.com/questions/2325863/match-フォールスルー - 同じコードを複数の場合に実行する) – nawfal