14.8. Dopasowywanie sekwencji wartości we wzorcach klas przypadku

Plik PatternsCaseClasses3.scala zawiera definicję klasy przypadku Numbers, której parametr n jest powtórzony.

Plik PatternsCaseClasses3.scala:
case class Numbers(n:Int*)

Plik PatternsCaseClasses4.scala zawiera przykład ilustrujący w jaki sposób mogą być konstruowane wzorce dopasowujące instancje klasy Numbers.

Plik PatternsCaseClasses4.scala:
def caseClassSequencePattern(value: Any):String = value match {
  case Numbers() => "No numbers."
  case Numbers(a) => "One number: "+a
  case Numbers(a,b,_*) => "Two or more numbers. First two are "+a+" and "+b
}

Pierwszy wzorzec dopasowuje instancje, które zostały utworzone bez argumentów (z liczbą argumentów równą zero). Drugi wzorzec dopasowuje instancje, które zostały utworzone z jednym argumentem. Wreszcie trzeci wzorzec dopasowuje instancje utworzone z przynajmniej dwoma argumentami. Znaki _* użyte w trzecim wzorcu dopasowują pozostałe argumenty klasy Numbers.

scala> :load PatternsCaseClasses4.scala
Loading PatternsCaseClasses4.scala...
caseClassSequencePattern: (value: Any)String

scala> caseClassSequencePattern(new Numbers())
res0: String = No numbers.

scala> caseClassSequencePattern(new Numbers(1))
res1: String = One number: 1

scala> caseClassSequencePattern(new Numbers(2,1))
res2: String = Two or more numbers. First two are 2 and 1

scala> caseClassSequencePattern(new Numbers(3,2,1))
res3: String = Two or more numbers. First two are 3 and 2

Znaki _* mogą się pojawić tylko jako ostatni element wzorca. To znaczy, że nie można na przykład stworzyć wzorca takiego, jak w przykładzie z pliku PatternsCaseClasses5.scala.

Plik PatternsCaseClasses5.scala:
def caseClassSequencePattern(value: Any):String = value match {
  case Numbers(_*, a) => "Last number: "+a
}

Próba użycia tego pliku skutkuje błędem kompilacji.

scala> :load PatternsCaseClasses5.scala
Loading PatternsCaseClasses5.scala...
<console>:2: error: bad simple pattern: bad use of _* (a sequence pattern must be the last pattern)
  case Numbers(_*, a) => "Last number: "+a
                 ^
<console>:1: error: eof expected but '}' found.
}
^

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.