Rust 在检查已借用的字段时,如何创建对其自身引用计数的值?
我正在尝试创建一个可变结构Rust 在检查已借用的字段时,如何创建对其自身引用计数的值?,rust,mutable,reference-counting,borrowing,refcell,Rust,Mutable,Reference Counting,Borrowing,Refcell,我正在尝试创建一个可变结构B,它存储其他结构a的实例,这些结构包含对B的引用。我想要一个实现,使得对原始B进行的任何变异都会传播到As中保存的引用 然而,在变异过程中,我必须检查包装在a实例中的B实例中的字段,从而打破了“一个可变异或多个不变”规则。我需要不可变地借用,而可变地借用,但是不可变的借用是变异函数内部的,并且不会超出其范围 use std::cell::RefCell; use std::rc::{Rc, Weak}; #[derive(Debug)] struct A {
B
,它存储其他结构a
的实例,这些结构包含对B
的引用。我想要一个实现,使得对原始B
进行的任何变异都会传播到A
s中保存的引用
然而,在变异过程中,我必须检查包装在a
实例中的B
实例中的字段,从而打破了“一个可变异或多个不变”规则。我需要不可变地借用,而可变地借用,但是不可变的借用是变异函数内部的,并且不会超出其范围
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()];
}
仅使用Rc
可以满足这些要求吗?如果不是,我是否必须陷入不安全的代码?文档中,比如:
恐慌
如果当前价值是可变借来的,则恐慌。为了不惊慌
变体,使用
使用try_borrow
时,要知道任何现有的借用必须是自身的
(因此是相等的),这样您的代码就可以编译:
let eq = t.try_borrow().map_or(true, |v| v.a == self.a);
assert![eq, "not equal"];
另见:
这看起来很有希望。然而,try\u forrow
即使在t
的其他字段被可变借用时也会失败,对吗?因此,如果我使用这种方法,我必须仔细观察语义。不过,非常感谢。