14.4. Zmienne we wzorcach

Zmienną we wzorcu jest identyfikator rozpoczynający się z małej litery. Zmienne we wzorcach, podobnie jak znak podkreślenia, dopasowują każdą wartość, ale dodatkowo przypisują tę wartość zmiennej.

Plik PatternsVars1.scala:
def varPattern(value: Any) =
  value match {
    case "abc" => "String abc matched"
    case x => "Value "+ x + " matched" 
  }

W wierszu pliku PatternsVars1.scala użyty jest wzorzec w postaci zmiennej. Wartość zmiennej jest użyta po prawej stronie strzałki, w klauzuli case, w której ten wzorzec występuje.

scala> :load PatternsVars1.scala
Loading PatternsVars1.scala...
varPattern: (value: Any)String

scala> varPattern("abc")
res0: String = String abc matched

scala> varPattern(12)
res1: String = Value 12 matched

Chociaż w przypadku wzorców mówimy o „zmiennych”, to w przypadku wzorców w klauzulach case są to tak naprawdę wartości niezmienne. Po przypisaniu wartości do takiej „zmiennej”, nie można jej już zmienić.

Plik PatternsVars2.scala:
def varPattern2(value: Any) =
  value match {
    case x => x = 1
  }

Z tego powodu metoda varPattern2 z pliku PatternsVars2.scala nie kompiluje się.

scala> :load PatternsVars2.scala
Loading PatternsVars2.scala...
<console>:12: error: reassignment to val
           case x => x = 1
                       ^

Podobnie jak w przypadku wzorca składającego się ze znaku podkreślenia, wzorzec składający się z pojedynczej zmiennej powinien występować jedynie jako ostatni z wzorców w wyrażeniu match.

Plik PatternsVars3.scala:
def varPattern3(value: Any) =
  value match {
    case x => "Value "+ x + " matched" 
    case "abc" => "String abc matched"
  }

Wzorzec z wiersza z pliku PatternsVars3.scala nie spełnia tego warunku, co powoduje wystąpienie ostrzeżeń kompilacji.

scala> :load PatternsVars3.scala
Loading PatternsVars3.scala...
<console>:12: warning: patterns after a variable pattern cannot match (SLS 8.1.1)
           case x => "Value "+ x + " matched"
                ^
<console>:13: warning: unreachable code due to variable pattern 'x' on line 12
           case "abc" => "String abc matched"
                         ^
<console>:13: warning: unreachable code
           case "abc" => "String abc matched"
                         ^
varPattern3: (value: Any)String

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.