gpt4 book ai didi

rust - 使用方法调用结果时的多个可变借用

转载 作者:行者123 更新时间:2023-12-03 11:48:33 34 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





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 ),我可以存储 &a2owner.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/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com