Странность синтаксиса Scala с: и требует нижнего регистра

это должно произойти?

scala> val myList = List(42)
myList: List[Int] = List(42)

scala> val s2 :: Nil = myList
s2: Int = 42

scala> val S2 :: Nil = myList
<console>:8: error: not found: value S2
       val S2 :: Nil = myList
           ^

он, по-видимому, чувствителен к регистру. Ошибка или "особенность"?

2 ответов


он чувствителен к регистру. В шаблоне соответствия идентификатор, начинающийся с заглавной буквы (или цитируемый backticks), рассматривается как ссылка на определенное значение, а не как новая привязка.

Это застает многих людей врасплох, и это не совсем очевидно из чтения спецификации языка Scala. Наиболее релевантными битами являются"переменной шаблоны" ...

переменная pattern x - простой идентификатор, который запускается с прописной буквой. Он соответствует любому значению и связывает имя переменной с этим значением.

... и "стабильные шаблоны идентификаторов":

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

вопросы:


характеристика :)

:: является формой сопоставления шаблонов. В Scala переменные, начинающиеся с нижнего регистра, используются для переменных, которые должны быть связаны совпадением. Переменные, начинающиеся с верхнего регистра (или заключенные в backticks), используются для существующей переменные, которые используются как часть схемы, чтобы соответствовать.