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.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage