如何在检查已经借用的字段时创建具有引用计数的引用的值?

问题描述 投票:0回答:1

我正在尝试创建一个可变结构B,该结构存储存储对A的引用的其他结构B的实例。我想要一个实现,使对原始B所做的任何更改都传播到A中保存的引用。

但是,在变异期间,我必须检查包裹在B实例中的A实例中的字段,从而违反了“一个可变的x或许多不可变的”规则。我需要不可变地借款,而需要可变地借款,但是不可变的借款是可变功能的内部功能,不会超出其范围。

use std::cell::RefCell;
use std::rc::{Rc, Weak};

#[derive(Debug)]
struct A {
    t: Weak<RefCell<B>>,
}

#[derive(Debug)]
struct B {
    a: usize,
    item: Option<A>,
}

impl B {
    pub fn mutate(&mut self, item: A) {
        {
            let t = item.t.upgrade().unwrap();

            // This check has to be done.
            //
            assert![t.borrow().a == self.a, "not equal"];
            //      ~~~~~~~~~~ panics on this borrow
        }
        //
        // The immutable borrow should end here.

        self.item = Some(item);
        self.a += 1;
    }
}

fn main() {
    let b = B { item: None, a: 0 };

    let bc = Rc::new(RefCell::new(b));

    let f = A {
        t: Rc::downgrade(&bc),
    };

    bc.borrow_mut().mutate(f);

    println!["{:?}", bc.borrow().item.as_ref().unwrap().t.upgrade()];
}

playground

恐慌:

thread 'main' panicked at 'already mutably borrowed: BorrowError'

仅使用Rc<RefCell<B>>可以满足这些要求吗?如果没有,我是否必须陷入unsafe代码?

rust mutable reference-counting borrowing refcell
1个回答
0
投票
RefCell::borrow的文档说:

Panics

如果当前是可变价值的借贷,则表示感谢。对于非恐慌变体,请使用RefCell::borrow

使用try_borrow知道任何现有借位必须为try_borrow(因此等于)允许您的代码进行编译:

try_borrow

另请参见:

    self
© www.soinside.com 2019 - 2024. All rights reserved.