14.9. Wiązanie zmiennej za pomocą znaku @
W dotychczas pokazanych przykładach znajdowały się proste wzorce, w których występowały zmienne, które pozwalały odwołać się po prawej stronie strzałki do dopasowywanych wartości. W pliku PatternsBinders1.scala znajduje się bardziej złożony wzorzec.
Plik PatternsBinders1.scala: def binders1(value: Any):String = value match { case (Person(a,b),Person(x,y)) => a+" "+b+" and "+x+" "+y case _ => "Not matched." }
Wzorzec dopasowuje krotkę dwuelementową, której elementami są obiekty klasy Person. Wzorzec zawiera zmienne, które pozwalają na odwołanie się do składowych tych obiektów.
scala> :load PatternsBinders1.scala
Loading PatternsBinders1.scala...
binders1: (value: Any)String
scala> binders1( (Person("John","Brown"),Person("Peter","Green")) )
res0: String = John Brown and Peter Green
Wzorzec użyty w metodzie binders1 nie pozwala na odwołanie się do dopasowanych obiektów Person w całości, bo z tymi obiektami nie ma powiązanych zmiennych. To samo dotyczy całej dopasowanej krotki. Scala pozwala powiązać zmienną z wartością dopasowaną do wzorca, jeśli poprzedzimy wzorzec nazwą zmiennej i znakiem @. Definicja metody, która z tego korzysta, znajduje się w pliku PatternsBinders2.scala.
Plik PatternsBinders2.scala: def binders2(value: Any):String = value match { case t @ (p @ Person(_,_),r @ Person(_,_)) => "Tuple "+t+" contains "+p+" and "+r case _ => "Not matched." }
Użyta we wzorcu zmienna t pozwala odwołać się do całej dopasowanej krotki. Zmienne p i r pozwalają odwołać się do dopasowanych instancji klasy Person.
scala> :load PatternsBinders2.scala
Loading PatternsBinders2.scala...
binders2: (value: Any)String
scala> binders2( (Person("John","Brown"),Person("Peter","Green")) )
res1: String = Tuple (Person(John,Brown),Person(Peter,Green)) contains Person(John,Brown) and Person(Peter,Green)
Plik PatternsBinders1.scala:
def binders1(value: Any):String = value match {
case (Person(a,b),Person(x,y)) => a+" "+b+" and "+x+" "+y
case _ => "Not matched."
}
