我正在尝试创建一个可变结构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()];
}
恐慌:
thread 'main' panicked at 'already mutably borrowed: BorrowError'
仅使用Rc<RefCell<B>>
可以满足这些要求吗?如果没有,我是否必须陷入unsafe
代码?
RefCell::borrow
的文档说:Panics如果当前是可变价值的借贷,则表示感谢。对于非恐慌变体,请使用
RefCell::borrow
。
使用try_borrow
知道任何现有借位必须为try_borrow
(因此等于)允许您的代码进行编译:
try_borrow
另请参见:
self