Кто позаимствовал переменную?

Я борюсь с заемщиком. У меня есть два одинаковых фрагмента кода, один работает, как я ожидал, а другой нет.

Тот, который работает, как я ожидаю:

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)
    }
}

Тот, который не:

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]
    }
}

Я надеялся, что смогу позвонитьBar2::f дважды, не раздражая компилятор, как в случае 1.

Вопрос в комментарии (3): кто занималbar2тогда как нет аффектации?

Вот что я понимаю:

В случае 1,f2 вызов: параметр времени жизни'a является одним из получения&Foo значение, поэтому это время жизни пусто, когда нет влияния, иbar не заимствовано послеBar1::f вызов;

В случае 2,bar2 заимствуетfoo (как неизменяемый), так что параметр времени жизни'b вBar2 структура являетсяfoo эталонное время жизни, которое заканчивается в концеf4 тело. призваниеBar2::f заимствуетbar2 для этой жизни, а именно до концаf4.

Но вопрос все же: кто занималbar2? Может ли это бытьBar2::f? КакBar2::f будет держать заемное владение после звонка? Что мне здесь не хватает?

Я использую Rust 1.14.0-nightly (86affcdf6 2016-09-28) на x86_64-pc-windows-msvc.

Ответы на вопрос(3)

Ваш ответ на вопрос