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.
}
^
Plik PatternsCaseClasses3.scala:
case class Numbers(n:Int*)
