2017-12-11 28 views
7

나는 녹 책의 두 번째 버전을 읽고있다 그리고 나는 반복자 섹션에서 다음 샘플 발견컴파일러가 for 루프로 이동 한 반복자가 불변이라고 불평하지 않는 이유는 무엇입니까?

let v1 = vec![1, 2, 3]; 
let v1_iter = v1.iter();  
for val in v1_iter { 
    println!("Got: {}", val); 
} 

왜 컴파일러가 v1_iter 불변이라고 불평하지 않습니다? 이 책은 for 루프가 v1_iter이라는 소유권을 가지고 있으며 뒤에서 변경할 수 있다고했지만 불변 변수를 가변적으로 변환 할 수 있습니까?

답변

9

이 책은 정확히 for 루프가 v1_iter의 소유권을 가지고 가고 뒤에서는 가변 만든

을 말한다, 하나는 더 간단한 예를 만들 수 있습니다

let v = vec![1,2,3]; 
let mut x = v; 
x.push(0); 

주를이 vx은 별도의 변수 바인딩입니다. 변수 v이 3 요소 벡터를 보유하고있는 한 변수의 계약은 벡터가 변형되지 않는다는 것입니다. 그러나 벡터는 x으로 이동되었으므로 변경 가능성이 허용됩니다. 함수 호출에도 동일하게 적용됩니다.

fn foo(mut x: Vec<i32>) { 
    x.push(0); 
} 

let v = vec![1,2,3]; 
foo(v); 

변수 중 하나만 수명주기의 어느 지점에서나 벡터를 소유하기 때문에 안전합니다. vx으로 옮기면 v을 더 이상 사용할 수 없습니다. 마찬가지로 코드에서 v1_iter은 for 루프 뒤에 더 이상 사용할 수 없습니다.

하지만 변경할 수있는 변수를 변경할 수 있습니까?

값이 mut으로 선언 된 새 변수로 이동 되었기 때문에 두 조각이 작동합니다. 그러나 일단 변수가 불변 (또는 변경 가능)으로 선언되면 해당 변수는 모든 수명 동안 유지되며 변경할 수 없습니다. 따라서 대답은 '아니요'이지만 소유권 의미론을 사용하면 서로 다른 변경 가능성 보장이있는 변수간에 값을 이동할 수 있습니다.