返回对 self 引用的函数无法编译,而相同的代码可以



给定两个片段,它们试图从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

相关内容

最新更新