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)

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.