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.