2009-10-26 2 views
25

다음과 같이 나는 튜플을 할당 할 수 있습니다튜플 매개 변수 선언과 할당 이상한

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

을하지만

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

가 대신 내가해야 할 것 같다 다음과 같이 난 안 다음 를 다시 할당 할 수 있습니다 :

min = 1 
max = 3 

전자는 왜 작동하지 않는 이유는 무엇입니까?

답변

26

글쎄, 그 방법 spec'ed 때문에, 나는 생각합니다.

튜플 지정은 패턴 일치의 예입니다. 마지막 예를 들어, case를 사용하여 하나를 수행, 지금

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

:

var PATTERN = ... // or val 

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

case PATTERN => ... 

그래서이 모든 경우 작동 : 패턴 매칭은 내가 리콜 세 곳에서 발생합니다. 이 예에서 nc이 아니고이 아니며 조금 더 일찍 정의 된 nc입니다. 패턴 일치는 새 값인 식별자 nc에 할당되며, 이는 case 문의 escope에 대한 이전 정의를 무시합니다. 동일한 예가 for 예에서 발생했으며, 이전에 정의한 nc은 변경되지 않았습니다.

이제 새 식별자에 새 값을 할당하는 대신 이전 값을 덮어 쓰게됩니다. 그것이 패턴 매칭이 작동하는 방식이 아니며, 이는 패턴 일치가 완전히 새로운 규칙을 수반한다는 것을 의미합니다. 스칼라가 사람을 불변성으로 부드럽게 뿌리 내 렸기 때문에 이것을 처리하기위한 새로운 규칙을 만들지 않은 것이 무리가 아니라고 봅니다.

+1

티켓은 https://issues.scala-lang.org/browse/SI-1324입니다 ("SIP가 필요합니다"). –