Wer hat eine Variable ausgeliehen?
Ich kämpfe mit dem Leihschein. Ich habe zwei ähnliche Code-Teile, von denen einer wie erwartet funktioniert und der andere nicht.
Der, der wie erwartet funktioniert:
mod case1 {
struct Foo {}
struct Bar1 {
x: Foo,
}
impl Bar1 {
fn f<'a>(&'a mut self) -> &'a Foo {
&self.x
}
}
// only for example
fn f1() {
let mut bar = Bar1 { x: Foo {} };
let y = bar.f(); // (1) 'bar' is borrowed by 'y'
let z = bar.f(); // error (as expected) : cannot borrow `bar` as mutable more
// than once at a time [E0499]
}
fn f2() {
let mut bar = Bar1 { x: Foo {} };
bar.f(); // (2) 'bar' is not borrowed after the call
let z = bar.f(); // ok (as expected)
}
}
Der, der nicht:
mod case2 {
struct Foo {}
struct Bar2<'b> {
x: &'b Foo,
}
impl<'b> Bar2<'b> {
fn f(&'b mut self) -> &'b Foo {
self.x
}
}
fn f4() {
let foo = Foo {};
let mut bar2 = Bar2 { x: &foo };
bar2.f(); // (3) 'bar2' is borrowed as mutable, but who borrowed it?
let z = bar2.f(); // error: cannot borrow `bar2` as mutable more than once at a time [E0499]
}
}
Ich hoffte, ich könnte @ anrufBar2::f
zweimal, ohne den Compiler zu irritieren, wie in Fall 1.
Die Frage steht im Kommentar (3): wer hat sich @ ausgeliehbar2
, während es keine Beeinflussung gibt?
Hier ist was ich verstehe:
In Fall 1,f2
call: der Lebenszeitparameter'a
ist die des empfangenden&Foo
value, diese Lebensdauer ist also leer, wenn keine Beeinträchtigung vorliegt, undbar
wird nach dem @ nicht ausgeliehBar1::f
Anruf
In Fall 2,bar2
leihtfoo
(als unveränderlich), also der Lebenszeitparameter'b
imBar2
struct ist dasfoo
Referenzlebensdauer, die am Ende von @ endf4
Körper. @ AnrufBar2::f
leihtbar2
für dieses Leben, nämlich bis zum Ende vonf4
.
Aber die Frage ist immer noch: Wer hat @ geliehbar2
? Könnte es seinBar2::f
? WieBar2::f
würde das geliehene Eigentum nach dem Anruf halten? Was vermisse ich hier?
Ich verwende Rust 1.14.0-nightly (86affcdf6 2016-09-28) auf x86_64-pc-windows-msvc.