2015-05-20 15 views
5

Wenn ich einen Iterator von Hand konsumieren will, hat es wandelbar sein:Warum benötigt eine for-Schleife keinen veränderbaren Iterator?

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

Aber ich es glücklich für Schleife mit einem konsumieren kann, auch wenn es unveränderlich ist.

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

I denken das funktioniert in etwa weil test_imm in der for-Schleife-Block bewegt wird, so test_imm kann nicht durch den äußeren Block mehr verwendet werden und ist (aus der Sicht des äußeren Blocks) unveränderlich bis zur for-Schleife, und dann ist es unzugänglich, also ist es in Ordnung.

Ist das richtig? Gibt es mehr zu erklären?

Ed: Aha, dies ist mehr oder weniger erklärt here.

Antwort

7

Das ist genau richtig. Da es in die for-Schleife verschoben wurde, besitzt es nun die for-Schleife und kann damit machen, was auch immer es will, einschließlich "mach es" veränderbar. Betrachten Sie dieses analoge Beispiel, in dem wir zu mutieren scheinen xs obwohl es unveränderlich ist, aber es ist wirklich, weil wir es bewegen, so der neue Besitzer ist frei damit zu tun, was auch immer es will, einschließlich der Bindung als veränderbar:

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

Beachten Sie, dass die Funktion kürzer gemacht werden kann, die mut Parameter Bequemlichkeit Syntax:

fn append(mut v: Vec<i32>, x: i32) -> Vec<i32> { 
    v.push(x); 
    v 
} 
Verwandte Themen