Объявление параметров кортежа и странность присваивания
Вопрос
Я могу назначить кортеж следующим образом:
var (min, max) = (1, 2)
Но я не могу переназначить следующим образом
(min, max) = (1, 3) //compiler error: ';' expected but '=' found
Вместо этого я, кажется, должен сделать:
min = 1
max = 3
Почему последний работает, а первый нет?
Решение
Ну, я полагаю, потому что так было определено.
Это присвоение кортежа является примером сопоставления с образцом. Сопоставление с образцом происходит в трех местах, о которых я вспоминаю:
var PATTERN = ... // or val
for (PATTERN <- ...) ...
case PATTERN => ...
Так что все эти случаи работают:
val l = List((1,'a'), (2,'b'), (3,'c'))
var (n, c) = l(0)
for ((n, c) <- l) println(n+": "+c)
l(1) match {
case (n, c) => println(n+": "+c)
}
Теперь возьмем последний пример, который использует case
. Обратите внимание, что n
и c
в этом примере являются не одинаковыми n
и c
определено немного раньше. Сопоставление с шаблоном назначит значения новым идентификаторам n
и c
, которые будут скрывать предыдущее определение для области case код> заявление. То же самое произошло в примере
for
, который не изменил ранее определенные n
и c
.
Теперь вам нужно переписать предыдущее значение вместо того, чтобы назначать новые значения новым идентификаторам. Это не то, как работает сопоставление с образцом, а это значит, что это повлечет за собой совершенно новое правило Поскольку Scala мягко подталкивает людей к неизменности, я полагаю, это не лишено смысла, что они не создали новое правило только для того, чтобы справиться с этим.