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