Объявление параметров кортежа и странность присваивания - PullRequest
27 голосов
/ 26 октября 2009

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

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

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

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

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

min = 1
max = 3

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

1 Ответ

27 голосов
/ 26 октября 2009

Ну, потому что так было определено, я полагаю.

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

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

...