14.10. Alternatywa wzorców
Wzorce można łączyć za pomocą pionowej kreski w alternatywy. Alternatywa kilku wzorców jest dopasowana, gdy przynajmniej jeden z wzorców wchodzących w jej skład może być dopasowany. W alternatywie nie można stosować zmiennych do wiązania wartości, ale można stosować znaki podkreślenia. W pliku PatternsAlternatives1.scala znajdują się przykłady alternatyw wzorców.
Plik PatternsAlternatives1.scala: def alternativePatterns(value: Any):String = value match { case ("abc", _) | ("abc",_,_) => "(abc,_,_) or (abc,_)" case (_: Int, _:Int) | (_: Long, _:Long) => "Tuple2 of Ints or Longs" case _ => "Not matched" }
Pierwsza z alternatyw dopasowuje krotki zawierające dwa lub trzy elementy i mające na pierwszej pozycji napis „abc”. Druga dopasowuje dwuelementowe krotki mające oba elementy typu Int lub oba typu Long.
scala> :load PatternsAlternatives1.scala Loading PatternsAlternatives1.scala... alternativePatterns: (value: Any)String scala> alternativePatterns(("abc",2)) res0: String = (abc,_,_) or (abc,_) scala> alternativePatterns(("abc",2,3)) res1: String = (abc,_,_) or (abc,_) scala> alternativePatterns(("abc",2,3,4)) res2: String = Not matched scala> alternativePatterns((1,2)) res3: String = Tuple2 of Ints or Longs scala> alternativePatterns((1L,2)) res4: String = Not matched scala> alternativePatterns((1L,2L)) res5: String = Tuple2 of Ints or Longs
W pliku PatternsAlternatives2.scala znajdują się przykłady błędnych, bo zawierających zmienne alternatyw wzorców.
Plik PatternsAlternatives2.scala: def patternAlternatives2(value: Any):String = value match { case ("abc", a) | ("abc",_,_) => "(abc,_,_) or (abc,_)" case x @ (_: Int, _:Int) | (_: Long, _:Long) => "Tuple2 of Ints or Longs" case _ => "Not matched" }
Próba użycia tego pliku skutkuje błędami kompilacji.
scala> :load PatternsAlternatives2.scala Loading PatternsAlternatives2.scala... <console>:12: error: illegal variable in pattern alternative case ("abc", a) | ("abc",_,_) => "(abc,_,_) or (abc,_)" ^ <console>:13: error: illegal variable in pattern alternative case x @ (_: Int, _:Int) | (_: Long, _:Long) => ^