2015-05-20 21 views
5

Nếu tôi muốn tiêu thụ một iterator bằng tay, nó phải được có thể thay đổi:Tại sao vòng lặp for không yêu cầu trình lặp có thể thay đổi?

let test = vec![1,2,3]; 
let mut test_mut = test.iter(); 
while let Some(val) = test_mut.next() { 
    println!("{:?}",val); 
} 

Nhưng tôi hạnh phúc có thể tiêu thụ nó với một vòng lặp for, ngay cả khi nó không thay đổi.

let test_imm = test.iter(); 
for val in test_imm { 
    println!("{:?}",val); 
} 

tôi nghĩ này khoảng làm việc vì test_imm được chuyển vào cho khối loop, vì vậy test_imm không thể được sử dụng bởi các khối bên ngoài nữa và là (từ quan điểm của khối ngoài) không thay đổi cho đến khi vòng lặp for, và sau đó nó không thể tiếp cận, vì vậy nó không sao.

Đúng không? Có nhiều hơn để được giải thích?

Ed: Aha, điều này ít nhiều được giải thích here.

Trả lời

7

Đúng vậy. Kể từ khi nó được chuyển đến vòng lặp for, vòng lặp for bây giờ sở hữu nó và có thể làm bất cứ điều gì nó muốn với nó, bao gồm cả "làm cho nó" có thể thay đổi được. Hãy xem ví dụ tương tự này, nơi chúng tôi dường như đang biến đổi xs mặc dù nó không thay đổi được, nhưng thực sự đó là vì chúng tôi đang di chuyển nó, vì vậy chủ sở hữu mới tự do làm bất cứ điều gì nó muốn, bao gồm việc ràng buộc lại nó là có thể thay đổi:

let xs: Vec<i32> = vec![1, 2, 3]; 

fn append(v: Vec<i32>, x: i32) -> Vec<i32> { 
    let mut my_v = v; 
    my_v.push(x); 
    my_v 
} 

let appended = append(xs, 4); 

playpen

Lưu ý rằng các chức năng có thể được thực hiện ngắn hơn bằng cách sử dụng cú pháp tiện mut tham số:

fn append(mut v: Vec<i32>, x: i32) -> Vec<i32> { 
    v.push(x); 
    v 
} 
Các vấn đề liên quan