It seems I don't get the borrowing concept in Rust. I have this simple example:
pub struct User {
name: Option<String>,
}
impl User {
pub fn new() -> Self {
Self {
name: Some("".to_string()),
}
}
pub fn write_name(&mut self) -> Result<(), &str> {
let name = self.generate_name()?;
self.name = Some(name);
Ok(())
}
pub fn generate_name(&self) -> Result<String, &str> {
Ok("John".to_string())
}
}
error[E0506]: cannot assign to `self.name` because it is borrowed
--> src/lib.rs:14:9
|
12 | pub fn write_name(&mut self) -> Result<(), &str> {
| - let's call the lifetime of this reference `'1`
13 | let name = self.generate_name()?;
| ---- - returning this value requires that `*self` is borrowed for `'1`
| |
| borrow of `self.name` occurs here
14 | self.name = Some(name);
| ^^^^^^^^^ assignment to borrowed `self.name` occurs here
I need to return Result
and I need to split name generation from setting name. How can I release borrowing so I can set the self.name
variable?