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

StackOverflow https://stackoverflow.com/questions/1624484

  •  06-07-2019
  •  | 
  •  

Вопрос

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top