Это особенность. Стабильные идентификаторы, начинающиеся с заглавной буквы, обрабатываются как литералы с целью сопоставления с образцом, а строчные идентификаторы «назначаются», поэтому вы можете использовать сопоставленное значение для чего-то другого.
Вы привели пример того, что это не имеет смысла:
x match {
case myValue1 => println ("match")
case _ =>
}
Но смысл легко увидеть, если мы немного изменим это:
x match {
case MyValue1 => println("match")
case MyValue2 => println("match")
case other => println("no match: "+other)
}
Конечно, можно использовать x
вместо other
выше, но вот несколько примеров, где это было бы не удобно:
(pattern findFirstIn text) {
// "group1" and "group2" have been extracted, so were not available before
case pattern(group1, group2) =>
// "other" is the result of an expression, which you'd have to repeat otherwise
case other =>
}
getAny match {
// Here "s" is a already a string, whereas "getAny" would have to be typecast
case s: String =>
// Here "i" is a already an int, whereas "getAny" would have to be typecase
case i: Int =>
}
Таким образом, существует множество причин, по которым для сопоставления с образцом удобно назначать сопоставленное значение идентификатору.
Теперь, хотя я думаю, что это одно из величайших недостатков Scala, потому что оно настолько тонкое и уникальное, что объясняется тем, что в рекомендуемом стиле Scala константы - это верблюжьи буквы, начинающиеся с заглавной буквы, а методы, а также значения и переменные (которые на самом деле тоже методы) начинаются с верблюда, начиная со строчных букв. Таким образом, константы естественно обрабатываются как литералы, в то время как другие рассматриваются как присваиваемые идентификаторы (которые могут скрывать идентификаторы, определенные во внешнем контексте).