Нелексический пожизненный обходной отказ

get() возвращает ссылку на элемент вектора, предварительно выдвигая значение при необходимости:

struct Container {
    vec: Vec<i32>,
}
impl Container {
    fn find(&mut self, v: i32) -> Option<&mut i32> {
        None // we don't care the implementation
    }

    fn get(&mut self, v: i32) -> &mut i32 {
        match self.find(v) {
            Some(x) => x,
            None => {
                self.vec.push(v);
                self.vec.last_mut().unwrap()
            }
        }
    }
}

fn main() {
    let mut container = Container { vec: Vec::new() };
    let x = container.get(42);
}

Не компилируется потому что self все еще заимствуется, когда мы пытаемся подтолкнуть значение (self.vec.push(v)):

error[E0499]: cannot borrow `self.vec` as mutable more than once at a time
  --> test.rs:13:17
   |
10 |         match self.find(v) {
   |               ---- first mutable borrow occurs here
...
13 |                 self.vec.push(v);
   |                 ^^^^^^^^ second mutable borrow occurs here
...
17 |     }
   |     - first borrow ends here

Это связано с нелексическим временем жизни.

Так что как обходной путь, я думал, что смогу переписать get() ограничить сферу self.find():

fn get(&mut self, v: i32) -> &mut i32 {
    if let Some(x) = self.find(v) {
        return x;
    }
    self.vec.push(v);
    self.vec.last_mut().unwrap()
}

К сожалению, это не работает:

error[E0499]: cannot borrow `self.vec` as mutable more than once at a time
  --> test.rs:13:9
   |
10 |         if let Some(x) = self.find(v) {
   |                          ---- first mutable borrow occurs here
...
13 |         self.vec.push(v);
   |         ^^^^^^^^ second mutable borrow occurs here
14 |         self.vec.last_mut().unwrap()
15 |     }
   |     - first borrow ends here

Я не могу понять почему.

0 ответов

Другие вопросы по тегам