14.3. Znak podkreślenia we wzorcach

Znak podkreślenia jest wzorcem dopasowującym każdą wartość.

Plik PatternsUnderscore1.scala:
def underscorePattern(value: Any):String =
  value match {
    case "abc" => "String abc matched."
    case 11 => "Number 11 abc matched."
    case _ => "Other value." 
  }

Taki wzorzec jest użyty w pliku PatternsUnderscore1.scala, w wierszu .

scala> :load PatternsUnderscore1.scala
Loading PatternsUnderscore1.scala...
underscorePattern: (value: Any)String

scala> underscorePattern("abc")
res0: String = String abc matched.

scala> underscorePattern(11)
res1: String = Number 11 abc matched.

scala> underscorePattern(12)
res2: String = Other value.

Wzorce w wyrażeniu match są sprawdzane kolejno, począwszy od góry. Ponieważ wzorzec składający się z pojedynczego znaku podkreślenia dopasowuje każdą wartość, to w wyrażeniu match powinien wystąpić jedynie jako ostatni z wzorców.

Plik PatternsUnderscore2.scala:
def underscorePattern2(value: Any) =
  value match {
    case "abc" => "String abc matched."
    case _ => "Other value."
    case 11 => "Number 11 abc matched."
  }

W metodzie underscorePattern2 z pliku PatternsUnderscore2.scala taki wzorzec nie jest ostatni, co powoduje wystąpienie ostrzeżeń kompilacji.

scala> :load PatternsUnderscore2.scala
Loading PatternsUnderscore2.scala...
<console>:13: warning: patterns after a variable pattern cannot match (SLS 8.1.1)
           case _ => "Other value."
                ^
<console>:14: warning: unreachable code due to variable pattern on line 13
           case 11 => "Number 11 abc matched."
                      ^
<console>:14: warning: unreachable code
           case 11 => "Number 11 abc matched."
                      ^
underscorePattern2: (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.