I’m trying to create a function that updates internal data if its id has changed, and then returns a reference to it. However, I’m encountering a borrow checker error and I’m not sure why.
Below is a simplified example of what I’m attempting:
struct SomeData {
id: i32,
other_data: (),
}
impl SomeData {
fn new(id: i32) -> Self {
Self {
id,
other_data: (),
}
}
}
struct MyData {
inner: Option<SomeData>,
}
impl MyData {
fn update(&mut self, id: i32) -> &SomeData {
match self.inner.as_ref() {
Some(inner) if inner.id == id => {
return inner
}
_ => {}
}
// At this point ref to inner should be dropped
self.inner = Some(SomeData::new(id));
// For some reason "`self.inner` is assigned to here but it was already borrowed"
self.inner.as_ref().unwrap()
}
}
error[E0506]: cannot assign to `self.inner` because it is borrowed
--> src/lib.rs:30:9
|
20 | fn update(&mut self, id: i32) -> &SomeData {
| - let's call the lifetime of this reference `'1`
21 | match self.inner.as_ref() {
| ---------- `self.inner` is borrowed here
22 | Some(inner) if inner.id == id => {
23 | return inner
| ----- returning this value requires that `self.inner` is borrowed for `'1`
...
30 | self.inner = Some(SomeData::new(id));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `self.inner` is assigned to here but it was already borrowed
For more information about this error, try `rustc --explain E0506`.
playground