Нелексический пожизненный обходной отказ
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
Я не могу понять почему.