Почему сопоставление с образцом в Scala не работает с переменными?

Возьмем следующую функцию:

def fMatch(s: String) = {
    s match {
        case "a" => println("It was a")
        case _ => println("It was something else")
    }
}

Этот шаблон отлично подходит:

scala> fMatch("a")
It was a

scala> fMatch("b")
It was something else

Я хотел бы иметь возможность сделать следующее:

def mMatch(s: String) = {
    val target: String = "a"
    s match {
        case target => println("It was" + target)
        case _ => println("It was something else")
        }
}

Это дает следующую ошибку:

fMatch: (s: String)Unit
<console>:12: error: unreachable code
               case _ => println("It was something else")

Я думаю, это потому, что он думает, что цель - это на самом деле имя, которое вы хотите присвоить любому входу. Два вопроса:

  1. Почему такое поведение? Разве нельзя просто найти в области видимости существующие переменные подходящего типа и использовать их в первую очередь, а если ни одна из них не найдена, обработать цель как имя для сопоставления с образцом?

  2. Есть ли обходной путь для этого? Есть ли способ сопоставить шаблон с переменными? В конце концов, можно использовать большой оператор if, но случай совпадения более элегантен.

108
задан Henry Henrinson 16 August 2011 в 12:12
поделиться