Почему сопоставление с образцом в Scala не работает с переменными? - PullRequest
106 голосов
/ 16 августа 2011

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

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")

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

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

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

1 Ответ

202 голосов
/ 16 августа 2011

Вы ищете стабильный идентификатор .В Scala они должны начинаться с заглавной буквы или заключаться в обратные ноты.

Оба этих решения помогут решить вашу проблему:

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

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

Чтобы избежать случайной ссылки на переменные, которыеЯ уже думаю, что в существующей области видимости имеет смысл, что поведение по умолчанию состоит в том, что строчные буквы являются переменными, а не стабильными идентификаторами.Только тогда, когда вы видите что-то, начинающееся с заглавных букв или с обратной галочки, вам нужно знать, что это происходит из окружающей области.

...