2009-10-26 12 views
25

mogę przypisać krotki następująco:Tuple i przypisanie kuriozum

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

Ale nie wtedy może ponownie przypisać następująco

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

Zamiast tego wydaje się mieć na celu:

min = 1 
max = 3 

Dlaczego te ostatnie działają, a te pierwsze nie?

Odpowiedz

26

Cóż, ponieważ to było tak zaprojektowane, jak sądzę.

To przyporządkowanie krotka jest przykładem dopasowania wzorca. pasujące do wzorca dzieje się w trzech miejscach, że przywołanie:

var PATTERN = ... // or val 

for (PATTERN <- ...) ... 

case PATTERN => ... 

Więc wszystkie te przypadki praca:

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) 
} 

Teraz weź ostatni przykład, jeden przy użyciu case. Zauważ, że n i c w tym przykładzie są nie tym samym n i zdefiniowane nieco wcześniej. Mecz wzór będzie przypisać wartości do nowych identyfikatorów n i c, który cień poprzednią definicję dla escope rachunku case. To samo stało się w przykładzie for, który nie zmienił wcześniej zdefiniowanych n i c.

Teraz, co chcesz się zdarzyć, aby zastąpić poprzednią wartość, zamiast przypisać nowe wartości do nowych identyfikatorów. Nie chodzi o to, jak działa dopasowanie do wzorca, co oznacza, że ​​jego realizacja wiązałaby się z całkowicie nową regułą. Skoro Scala delikatnie popycha ludzi w kierunku niezmienności, to nie jest to nierozsądne, że nie stworzyli nowej reguły, żeby sobie z tym poradzić.

+1

bilet jest https://issues.scala-lang.org/browse/SI-1324 ("będzie musiała SIP") –