Multiples Pattern-Matching


Auf Stackoverflow habe ich schon häufiger die Frage gelesen, wie man es anstellt, dass beim Pattern-Matching nicht nur der erste passende Fall berücksichtigt werden, sondern alle passenden Fälle. Eingebaut gibt es das leider nicht, es ist aber auch nicht schwer zu realisieren. Hier eine recht elegante Version von Philippe:

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)

Und die Anwendung:

(2,4) matchAll (
  { case (2,_) => "starts with two" },
  { case (3,_) => "starts with three" },
  { case (_,4) => "ends with four" },
  { case (a,b) if a + b == 6 => "adds up to six" }
)

//--> ArrayBuffer(starts with two, ends with four, adds up to six)

Ich denke, dass man mit der im Vergleich zu match leicht veränderten Syntax gut leben kann, und fände es gut, wenn dieses Konstrukt auch in die Scala-Bibliotheken aufgenommen würde.

Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s