Объявление параметра Tuple и странность присваивания

Я могу назначить кортеж следующим образом:

var (min, max) = (1, 2)

Но я не могу повторно назначить следующим образом

(min, max) = (1, 3) //compiler error: ';' expected but '=' found

Вместо этого мне кажется, что нужно делать:

min = 1
max = 3

Почему последнее работает, а первое не работает?

Ответ 1

Хорошо, потому что это было указано так, я полагаю.

Это, назначение кортежа, является примером сопоставления шаблонов. Согласование образцов происходит в трех местах, о которых я вспоминаю:

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