Standardowe dopasowanie do wzoru będzie zawsze pasować tylko na dokładnie jednym przypadku. można zbliżyć się do tego, co chcesz, korzystając z faktu, że wzory mogą być traktowane jako funkcja częściowa (patrz Language Specification sekcja 8.5, Pattern Matching anonimowe Funkcje) oraz poprzez zdefiniowanie własnego operatora dopasowania, choć:
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'
Składnia jest nieco inna niż zwykle, ale dla mnie taka konstrukcja jest wciąż świadkiem mocy Scali.
Twój przykład jest teraz zapisana jako:
// prints both 'foo' and 'bar'
"both" matchAll (
{ case "both" | "foo" => println("foo") },
{ case "both" | "bar" => println("bar") }
)
(Edytujhuynhjl wskazał, że dał przerażająco podobną odpowiedź this question.)
możliwe duplikat [Match "fallthrough": wykonywanie tego samego fragmentu kodu na więcej niż jednym przypadku] (http://stackoverflow.com/questions/2325863/match- przewrót-wykonanie-ten sam kawałek-za-kod-za-więcej niż jeden-przypadek) – nawfal