给定两个片段,它们试图从self返回对成员值的引用,我真的不明白为什么具有单独函数的片段不编译。
这项工作(戈德堡(:
struct Foo {
a: bool,
b: u32,
}
impl Foo {
fn get(&mut self) -> &u32 {
if self.a {
return &self.b;
}
self.a = true;
self.b = 10;
return &self.b;
}
}
虽然这不是(godbolt(:
struct Foo {
a: bool,
b: u32,
}
impl Foo {
fn try_get(&self) -> Option<&u32> {
if self.a {
return Some(&self.b);
}
return None;
}
fn get(&mut self) -> &u32 {
if let Some(val) = self.try_get() {
return val;
}
self.a = true;
self.b = 10;
return &self.b;
}
}
错误:
error[E0506]: cannot assign to `self.a` because it is borrowed
--> src/lib.rs:19:9
|
14 | fn get(&mut self) -> &u32 {
| - let's call the lifetime of this reference `'1`
15 | if let Some(val) = self.try_get() {
| -------------- borrow of `self.a` occurs here
16 | return val;
| --- returning this value requires that `*self` is borrowed for `'1`
...
19 | self.a = true;
| ^^^^^^^^^^^^^ assignment to borrowed `self.a` occurs here
据我所知,它看不出,顶部的引用会在可变更改之前发布,但为什么呢?它可以在没有函数的情况下证明它,为什么它不能用函数来证明呢
有什么方法可以使函数调用正常工作吗
对我来说,这看起来真的像一个错误
我以前没有看到类似的答案,但在编辑后stackoverflow发现:从HashMap或Vec返回引用会导致借位持续时间超过其范围';在吗?
TLDR:是的,这是一个已知的错误,将被修复,在这种实现中,没有(有用的(方法来使用函数
https://github.com/rust-lang/rust/issues/21906#issuecomment-73296543