Ну, потому что так было определено, я полагаю.
Это, назначение кортежа, является примером сопоставления с образцом. Сопоставление с образцом происходит в трех местах, о которых я помню:
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 мягко подталкивает людей к неизменности, я полагаю, что вполне разумно, что они не создали новое правило только для того, чтобы справиться с этим.