Я заметил следующее поведение в scala при попытке развернуть кортежи в vals:
scala> val (A, B, C) = (1, 2, 3)
<console>:5: error: not found: value A
val (A, B, C) = (1, 2, 3)
^
<console>:5: error: not found: value B
val (A, B, C) = (1, 2, 3)
^
<console>:5: error: not found: value C
val (A, B, C) = (1, 2, 3)
^
scala> val (u, v, w) = (1, 2, 3)
u: Int = 1
v: Int = 2
w: Int = 3
Это вызвано тем, что механизм сопоставления с образцом scala автоматически предполагает, что все идентификаторы, запускающиеся с прописных букв в шаблонах, являются константами, или это происходит из-за некоторой другой причины?
Спасибо!
Да, и становится еще хуже:
val (i, j) : (Int, Int) = "Hello" -> "World"
Вышеупомянутое будет компилироваться и завершится ошибкой во время выполнения с ClassCastException
. Легко забыть, что объявление (i, j)
является шаблоном .
РЕДАКТИРОВАТЬ : для ziggystar правила присваивания Scala заявляют, что в операторе:
val p = expr //or var
p
может быть либо идентификатором, либо шаблоном (см. раздел 15.7 из Программирование на Scala , стр. 284). Так, например, верно следующее:
val x :: y :: z :: rest = List(1, 2, 3, 4)
Принимая это вместе с тем фактом, что шаблоны стираются (т.е. информация о параметрическом типе не отмечена), означает, что мой исходный пример будет компилироваться.
Из [scala] Вопрос о соглашениях об именах вы можете прочитать
Начальная заглавная буква имеет преимущество при сопоставлении с образцом. Идентификаторы с начальной заглавной буквой считаются значениями для сопоставления, а не привязанными переменными.