La coincidencia de patrones estándar siempre coincidirá solo en exactamente un caso. Puede estar cerca de lo que desea realizar con el hecho de que los patrones pueden ser tratados como funciones parciales (ver el Language Specification, Sección 8.5, coincidencia de patrón funciones anónimas) y la definición de su propio operador de juego, sin embargo:
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'
La sintaxis es ligeramente diferente a la habitual, pero para mí una construcción así sigue siendo un testimonio del poder de Scala.
Su ejemplo está escrito como:
// prints both 'foo' and 'bar'
"both" matchAll (
{ case "both" | "foo" => println("foo") },
{ case "both" | "bar" => println("bar") }
)
(Editarhuynhjl señaló que dio una respuesta terriblemente similar a this question.)
posible duplicado del [Partido "fallthrough": la ejecución misma pieza de código para más de un caso] (http://stackoverflow.com/questions/2325863/match- fallthrough-execute-same-piece-of-code-for-more-than-one-case) – nawfal