Нюанс разворачивания кортежа Scala

Я заметил следующее поведение в 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 автоматически предполагает, что все идентификаторы, запускающиеся с прописных букв в шаблонах, являются константами, или это происходит из-за некоторой другой причины?

Спасибо!

15
задан Paul Milovanov 28 April 2010 в 07:44
поделиться

2 ответа

Да, и становится еще хуже:

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)

Принимая это вместе с тем фактом, что шаблоны стираются (т.е. информация о параметрическом типе не отмечена), означает, что мой исходный пример будет компилироваться.

20
ответ дан 1 December 2019 в 01:38
поделиться

Из [scala] Вопрос о соглашениях об именах вы можете прочитать

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

13
ответ дан 1 December 2019 в 01:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: