(Это дополнительный комментарий к ответу Даниэля, но я публикую его как ответ в целях выделения и форматирования синтаксиса.)
Точка зрения Дэниела о важности стиля использования начальной заглавной буквы в семантике языка более тонкая и важная, чем я изначально считал, когда изучал Scala.
Рассмотрим следующий код:
object Case {
val lowerConst = "lower"
val UpperConst = "UPPER"
def main(args: Array[String]) {
for (i <- Seq(lowerConst, UpperConst, "should mismatch.").map(Option.apply)) {
print("Input '%s' results in: ".format(i))
i match {
case Some(UpperConst) => println("UPPER!!!")
case Some(lowerConst) => println("lower!")
case _ => println("mismatch!")
}
}
}
}
Я наивно ожидал, что это коснется всех случаев в матче. Вместо этого он печатает:
Input 'Some(lower)' results in: lower!
Input 'Some(UPPER)' results in: UPPER!!!
Input 'Some(should mismatch.)' results in: lower!
Что происходит, так это то, что case Some(lowerConst)
тень затеняет val lowerConst
и создает локальную переменную с тем же именем, которая будет заполнена каждый раз, когда Some
вычисляется содержащая строка.
По общему признанию, есть способы обойти это, но самый простой - следовать руководству по стилю для постоянного именования.
Если вы не можете следовать соглашению об именах, то, как указывает @reggoodwin в комментариях ниже, вы можете поместить имя переменной в галочки, например
case Some(`lowerConst`) => println("lower!")