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

标签 rust borrow-checker borrowing

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





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/

相关文章:

rust - 如何在成员函数中修改结构的可选字段

reference - Rust 中的生命周期注解会改变变量的生命周期吗?

rust - 如何编写一个可以读写缓存的 rust 函数?

rust - 借用时临时值(value)下降,但我不想租借

rust - 迭代获取子节点的可变引用

rust - 为什么需要 AddAssign 作为 super 特征的特征也需要调整大小?

types - 什么是正确的数据类型,以使函数能够在Rust的迭代器之间复制,并且功能尽可能广泛?

rust - 如何解决 [E0382] : use of moved value in a for loop?

rust - 借用中间变量可绕过的错误

rust - 如何在泛型中指定迭代器类型?