我似乎没有理解Rust中的借用概念。我有一个简单的例子:
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
我需要返回Result
,并且我需要从设置名称中分离名称生成。如何释放借款以便设置self.name
变量?
函数头
pub fn generate_name(&self) -> Result<String, &str>
应该改为
pub fn generate_name(&self) -> Result<String, &'static str>
前者使编译器假设错误类型&str
的生存期与self
的生存期相关联,因此self
在调用站点上被认为是借用的,直到结果超出范围。您的错误类型不太可能借用self
——您更可能希望将静态字符串作为错误返回。
您对generate_name()
的定义在参数列表中有一个隐式生存期参数(self
引用的生存期(,在返回类型(错误类型&str
的生存期。如果参数列表和返回类型中都只有一个可用生存期参数,编译器会应用一个生存期省略规则来标识可用生存期的参数,因为这很可能是您想要的。如果这不是你想要的,比如在本例中,你需要明确地说明所需的寿命。