14.11. Dozory

Mimo że istnieją różne rodzaje wzorców oraz mimo że wzorce można składać ze sobą, dotychczas poznane mechanizmy nie pozwalają na wyrażenie pewnych warunków. Przypuśćmy, że chcielibyśmy dopasować obiekty Person, ale tylko wtedy, jeśli imię danej osoby zawiera trzy litery lub mniej. W takiej sytuacji, w klauzuli case, po wzorcu, a przed podwójną strzałką, możemy umieścić tak zwany dozór, na który składają się słowo kluczowe if oraz występujący po nim warunek logiczny. Warunku logicznego nie trzeba umieszczać w nawiasach, tak jak ma to miejsce w przypadku wyrażenia warunkowego. Metoda zdefiniowana w pliku PatternsGuards1.scala zawiera wyrażenie match wykorzystujące dozory.

Plik PatternsGuards1.scala:
def guards(value: Any) = value match {
  case Person(a,_) if a.length < 4 => "Hello "+a+". You have a short name!" 
  case Person(a,_) if a.length > 8 => "Hello "+a+". You have a long name!" 
  case Person(a,_) => "Hello "+a+"."
}

Wszystkie trzy wzorce znajdujące się w wyrażeniu match dopasowują obiekty typu Person. Dwie z trzech klauzul case posiadają, oprócz wzorca, dozór. Dozór w pierwszej klauzuli case (wiersz ) powoduje dopasowanie jedynie takich obiektów klasy Person, w których długość wartości pierwszego parametru jest mniejsza od 4. Dozór w drugiej klauzuli case (wiersz ) powoduje dopasowanie jedynie takich obiektów klasy Person, w których długość pierwszego parametru jest większa od 8. W wyrażeniach logicznych dozoru można odwoływać się do zmiennych z wzorca. W obu dozorach z przykładu występują odwołania do zmiennych o nazwie a.

scala> :load PatternsGuards1.scala
Loading PatternsGuards1.scala...
guards: (value: Any)String

scala> guards(new Person("Alexander","Moore"))
res0: String = Hello Alexander. You have a long name!

scala> guards(new Person("Ron","Goodman"))
res1: String = Hello Ron. You have a short name!

scala> guards(new Person("Peter","Green"))
res2: String = Hello Peter.

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.