(Это дополнение к ответу Даниэля, но я публикую его в качестве ответа для подсветки и форматирования синтаксиса.)
Даниэль говорит о стиле использования начальной заглавной буквы:важный в языковой семантике более тонкий и важный, чем я изначально полагал, когда изучал 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!")