这个问题在这里已经有了答案:
Why can't I store a value and a reference to that value in the same struct?
(3 个回答)
1年前关闭。
在这个简化的代码中,我有两个重要的结构:Owner
获取对象的所有权,将其添加到 Vec,并返回对它的引用; RefKeeper
只保存对 Vec 中对象的引用。 Owner
还有一个RefKeeper
.
struct Foo(i32);
struct Owner<'o> {
list: Vec<Foo>,
refkeeper: RefKeeper<'o>,
}
impl<'o> Owner<'o> {
pub fn new() -> Self {
Self {
list: Vec::new(),
refkeeper: RefKeeper::new(),
}
}
pub fn add(&mut self, me: Foo) -> &Foo {
self.list.push(me);
return self.list.last().unwrap();
}
pub fn add_ref(&mut self, me: &'o Foo) {
self.refkeeper.add(me);
}
}
struct RefKeeper<'ro> {
list: Vec<&'ro Foo>,
}
impl<'ro> RefKeeper<'ro> {
pub fn new() -> Self {
Self { list: Vec::new() }
}
pub fn add(&mut self, me: &'ro Foo) {
self.list.push(me);
}
}
fn main() {
let mut owner = Owner::new();
let a1 = Foo(1);
let a1_ref = owner.add(a1);
// this variant doesn't work
owner.add_ref(a1_ref);
// let mut refkeeper = RefKeeper::new();
// refkeeper.add(a1_ref);
// let a2 = Foo(2);
// owner.add_ref(&a2);
}
两种变体有效:如果我制作
RefKeeper
在外部,我可以存储 Owner::add
返回的 ref ;另一方面,如果我创建一个新对象( a2
),我可以存储 &a2
在 owner.refkeeper
没有问题。为什么其他变体会给我这个错误?error[E0499]: cannot borrow `owner` as mutable more than once at a time
--> src/main.rs:46:5
|
43 | let a1_ref = owner.add(a1);
| ----- first mutable borrow occurs here
...
46 | owner.add_ref(a1_ref);
| ^^^^^ ------ first borrow later used here
| |
| second mutable borrow occurs here
这种模式有什么根本错误吗?我的印象是生命周期应该没有问题,因为所有借用都在同一个对象中使用。
最佳答案
因为Owner::add
返回绑定(bind)到 &mut self
生命周期的引用.所以只要返回值存在( a1_ref
),那么 &mut self
引用也是如此。所以调用add_ref
失败,因为它需要另一个 mut self
同一个实例的引用。
您可以拥有一个可变引用,也可以拥有多个不可变引用。
打电话的原因refkeeper.add
然后 owner.add_ref
没有给你同样的问题是因为添加到 refkeeper
不需要再次引用 owner
.
您可能想查看 std::rc::Rc .
关于rust - 使用方法调用结果时的多个可变借用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62226888/