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) =>
^
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"
}
