Ключ к пониманию - это последовательность шаблонов, затем первый шаблон, который соответствует победам, в то время как остальные игнорируются
Выражение совпадения оценивается путем проверки каждого из шаблоны в том порядке, в котором они написаны. Выбирается первый совпадающий шаблон, а затем выбирается и выполняется часть, следующая за стрелкой.
Например, рассмотрим шаблон переменной pattern2
ниже, который соответствует любому значению
(42: Any) match {
case pattern1: String => "first pattern1 was tried but did not match"
case pattern2 => "then pattern2 was tried and it did indeed match"
case pattern3: Int => "so pattern3 was not tried because pattern2 already won"
}
тогда pattern3
никогда не будет выполняться, и все выражение сопоставления оценивается как
then pattern2 was tried and it did indeed match
, в то время как компилятор выдает предупреждение
Warning:(19, 28) unreachable code due to variable pattern 'pattern2' on line 22
case pattern3: Int => "so pattern3 was not tried because pattern2 already won"
Это не ошибка , но просто указан способ работы компилятора, чтобы избежать плохого или недоступного кода, который никогда не будет выполнен. Другой способ подумать об этом - представить сопоставление с образцом как цепочку if-else
s
if (cond1) {
"first cond1 was tried but did not match"
} else if (cond2) {
"then cond2 was tried and it did indeed match"
} else if (cond3) {
"so cond3 was not tried because cond2 already won"
} else {
// crash
}