LINUX.ORG.RU

Fighting the borrow checker: обращение к объекту в аргументах при вызове метода из него же

 


2

5
struct Foo;

impl Foo {
    fn get(&self) -> usize {
        42
    }
    
    fn set(&mut self, b: usize) {
    }
}

fn main() {
    let mut f = Foo;
    
    f.set(f.get());
}

results in


<anon>:15:11: 15:12 error: cannot borrow `f` as immutable because it is also borrowed as mutable [E0502]
<anon>:15     f.set(f.get());
                    ^
<anon>:15:5: 15:6 note: previous borrow of `f` occurs here; the mutable borrow prevents subsequent moves, borrows, or modification of `f` until the borrow ends
<anon>:15     f.set(f.get());
              ^
<anon>:15:19: 15:19 note: previous borrow ends here
<anon>:15     f.set(f.get());
                           ^
error: aborting due to previous error
playpen: application terminated with error code 101

Почему? Здесь всё верно, иммутабельное заимствование f при вызове get() кончается до вызова set().

★★★★★

Последнее исправление: intelfx (всего исправлений: 3)

Вангану, что заимствование действует на протяжении выражения и вынос f.get() в отдельную переменную спасёт отца русской демократии.

anonymous
()

По-моему, компилятор пишет, что изменяемое заимствование начинается до неизменяемого.

Virtuos86 ★★★★★
()
Ответ на: комментарий от anonymous

вынос f.get() в отдельную переменную спасёт отца русской демократии

Вынос спасет, но вангую, что ТС хочет узнать, как оно работает.

Virtuos86 ★★★★★
()
Последнее исправление: Virtuos86 (всего исправлений: 1)
Ответ на: комментарий от anonymous

Именно так. Но это же эквивалентное преобразование. Получается, что borrow checker проверяет слишком строго?

2 Virtuos86: я хочу узнать, почему оно работает именно так, и собирается ли кто-нибудь это чинить.

intelfx ★★★★★
() автор топика
Последнее исправление: intelfx (всего исправлений: 2)
Ответ на: комментарий от Virtuos86

Вынос спасет, но вангую, что ТС хочет узнать, как оно работает.

https://doc.rust-lang.org/reference.html#unary-operator-expressions

The lvalue is also placed into a borrowed state for the duration of the reference.

Логично, что время жизни переменной ссылочного типа - текущий блок, а время жизни ссылки-значения - текущее выражение.

anonymous
()
Ответ на: комментарий от intelfx

я хочу узнать, почему оно работает именно так, и собирается ли кто-нибудь это чинить.

Подробности о том как оно работает есть в растаномиконе, конкретно вот эта глава, хотя там много интересного.

Улучшать бороу чекер однозначно хотят, есть разные предложения типа такого.

DarkEld3r ★★★★★
()
Ответ на: комментарий от DarkEld3r

Ага. Отли-ично. К списку вещей, которые я буду «джва года ждать» в расте, добавилась ещё одна.

intelfx ★★★★★
() автор топика
Последнее исправление: intelfx (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.