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