14.7. Klasy przypadku we wzorcach

Składnia wzorców dopasowujących krotki jest podobna do składni używanej przy tworzeniu krotek. Podobna obserwacja jest prawdziwa także dla tak zwanych klas przypadku. Klasy przypadku są specjalnymi rodzajami klas, mającymi pewne specyficzne własności. Jedną z takich własności jest to, że są przystosowane do użycia przy dopasowywaniu wzorców. Inną jest to, że do utworzenia instancji tych klas nie trzeba (ale można) używać słowa kluczowego new.

Klasy przypadku są opisane w rozdziale 15.

Definiując klasę przypadku należy przed słowem kluczowym class umieścić słowo case. W pliku PatternsCaseClasses1.scala znajdują się definicje dwóch klas przypadku. Pierwsza z nich — Person — reprezentuje osobę mającą imię i nazwisko. Druga — RGB — reprezentuje kolor, w postaci wartości składowych kolorów podstawowych: czerwonego, zielonego i niebieskiego.

Plik PatternsCaseClasses1.scala:
case class Person(name: String, surname: String)
case class RGB(r: Int, g: Int, b: Int)

Zdefiniowana w pliku PatternsCaseClasses2.scala metoda caseClassPattern zawiera wzorce dopasowujące instancje obu klas.

Plik PatternsCaseClasses2.scala:
def caseClassPattern(value: Any):String = value match {
  case Person("John",_) => "Hello John!"
  case Person(n, s) => "Your name is "+n+" "+s
  case RGB(r, _, _) => "Red component value: "+r
}

Pierwszy z wzorców dopasowuje instancje klasy Person posiadające w pierwszym parametrze napis „John”. Drugi wzorzec dopasowuje pozostałe instancje klasy Person, jednocześnie przypisując zmiennym n i s wartości obu parametrów instancji tej klasy. Trzeci wzorzec dopasowuje instancje klasy RGB, jednocześnie przypisując zmiennej r wartość pierwszego parametru.

scala> :load PatternsCaseClasses2.scala
Loading PatternsCaseClasses2.scala...
caseClassPattern: (value: Any)String
scala> val p1 = Person("John","Brown")
p1: Person = Person(John,Brown)

scala> val p2 = new Person("Peter","Green")
p2: Person = Person(Peter,Green)

scala> caseClassPattern(p1)
res0: String = Hello John!

scala> caseClassPattern(p2)
res1: String = Your name is Peter Green

scala> caseClassPattern(RGB(5,6,7))
res2: String = Red component value: 5

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.