Ich lerne Rust und ich habe in ein verwirrendes Verhalten geraten. Der folgende Code kompiliert fein und funktioniert wie erwartet (bearbeiten: added anderen Code als Testfunktion, weggelassen vorher):Typ Inferenz und Kreditaufnahme vs Eigentumsübertragung
struct Container<'a> {
contents : &'a mut i32,
}
fn main() {
let mut one = Container { contents: &mut 5 };
test(&mut one);
println!("Contents: {}",one.contents);
}
fn test<'a>(mut x : &'a mut Container) {
*x.contents += 1;
let y = x;
*y.contents += 1;
x = y;
println!("{:?}",*x.contents)
}
nun in der Erklärung
let y = x;
der Typ abgeleitet. Da x
vom Typ &'a mut Container
, dachte ich, dass dies wäre gleichbedeutend:
let y: &'a mut Container = x;
Aber wenn ich das tue, der Compiler nimmt Ausgabe:
test_3.rs:25:5: 25:10 error: cannot assign to `x` because it is borrowed
test_3.rs:25 x = y;
^~~~~
test_3.rs:23:33: 23:34 note: borrow of `x` occurs here
test_3.rs:23 let y: &'a mut Container = x;
Wie wird x
nicht von diesem Punkt in der geliehene richtig funktionierendes Beispiel? Getestet habe ich durch die Linie x = y;
von der korrekt funktionierende Version weggelassen und die Compiler sagte:
test_3.rs:24:13: 24:14 note: `x` moved here because it has type `&mut Container<'_>`, which is moved by default
So bin ich eine Bewegung bekommen, wenn ich den Typen nicht explizit definieren, sondern Borrow anders. Was passiert, wie bekomme ich das gleiche Verhalten wie vorher, während ich explizit den Typ gebe, und was bewirkt das Bewegungsverhalten in einem Fall, sondern leiht es in dem anderen?
Edited mit vollem Programm
Vielleicht ein [Beispiel wie folgt] (http://is.gd/Ht32Jl)? – Shepmaster
Hallo, tut mir leid; Hier ist ein [der vollständige Code] (http://is.gd/9oz2kT). Ihr Beispiel erfasst das Problem genau. –
Related: http://stackoverflow.com/q/32154387/1763356 – Veedrac