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
Plik PatternsVars1.scala:
def varPattern(value: Any) =
value match {
case "abc" => "String abc matched"
case x => "Value "+ x + " matched" 