无法赋值,因为它是在返回包含引用的Result的结构的方法中借用的



我似乎没有理解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的生存期。如果参数列表和返回类型中都只有一个可用生存期参数,编译器会应用一个生存期省略规则来标识可用生存期的参数,因为这很可能是您想要的。如果这不是你想要的,比如在本例中,你需要明确地说明所需的寿命。

最新更新