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.
Plik PatternsGuards1.scala:
def guards(value: Any) = value match {
case Person(a,_) if a.length < 4 => "Hello "+a+". You have a short name!" 