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

Język programowania Scala Wydanie 2. Copyright © Grzegorz Balcerek 2016

Licencja Creative Commons

Ten utwór jest dostępny na licencji Creative Commons Uznanie autorstwa-Na tych samych warunkach 4.0 Międzynarodowe.

Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.