2017-12-11 4 views
7

ich die zweite Auflage des Rust Buch lese und ich fand in der Iteratoren Abschnitt die folgende Beispiel:Warum beschwert sich der Compiler nicht, dass ein Iterator, der in eine For-Schleife verschoben wurde, unveränderlich ist?

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

Warum beschwert sich der Compiler nicht, dass v1_iter unveränderlich ist? Das Buch sagt, dass die for-Schleife den Besitz von v1_iter übernommen hat und hinter den Kulissen veränderlich gemacht hat, aber können Sie eine unveränderliche Variable in veränderbar umwandeln?

Antwort

9

Das Buch sagt der for-Schleife wandelbar nahm das Eigentum an v1_iter und machte es hinter den Kulissen,

Genau, und man kann ein noch einfacheres Beispiel machen:

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

Beachten Sie, dass v und x sind separate Variablenbindungen: Solange die Variable v unseren 3-Element-Vektor behielt, bestand der Vertrag der Variablen darin, dass der Vektor nicht mutiert wird. Der Vektor wurde jedoch nach x verschoben, was erklärt, dass die Wandlungsfähigkeit akzeptabel ist. Gleiches gilt auch für Funktionsaufrufe:

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

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

Dies ist sicher, weil nur eine der Variablen, die den Vektor an einer beliebigen Stelle seiner Lebensdauer besitzt. Sobald v zu x verschoben wurde, kann v nicht mehr verwendet werden. Entsprechend kann in Ihrem Code v1_iter nicht mehr nach der for-Schleife verwendet werden.

aber können Sie eine unveränderliche Variable in eine veränderbare konvertieren?

Beide Snippets funktionieren, weil der Wert in eine neue Variable verschoben wurde, die als mut deklariert wurde. Sobald eine Variable jedoch als unveränderlich (oder veränderbar) deklariert ist, bleibt diese Variable für ihre gesamte Lebensdauer so lange bestehen, und dies kann nicht geändert werden. Die Antwort lautet also nein, aber die Semantik der Eigentumsrechte ermöglicht das Verschieben von Werten über Variablen mit unterschiedlichen Mutabilitätsgarantien.

Verwandte Themen