我有一个 struct Region,它包含[Option<Rc<RefCell<Region>>>; 2]作为它的subregionsOption<Weak<RefCell<Region>>>作为它的container.我正在编写一个方法,在selfself.container之间插入一个新的Region,这需要我将Rc克隆到self,以包含在新创建的Region中作为subregions中的一个.当self.containerSome时,这是可能的,因为我可以走到容器,然后克隆它与self匹配的subregion,但是当selfNone作为容器时,我不知道如何从传递到方法的&mut self中获得selfRc的克隆.

这里有一些代码,使它更清晰.

struct Region {
    subregions: [Option<Rc<RefCell<Region>>>; 2],
    container: Option<Weak<RefCell<Region>>>,
}

impl Region {
    fn clone_from_container(&self) -> Option<Rc<RefCell<Region>>> {
        Some(Rc::clone(&self.container
                       .as_ref()?
                       .upgrade()
                       .unwrap()
                       .borrow()
                       .subregions[self.from()]
                       .as_ref()
                       .unwrap()))
    }

    pub fn insert_above(&mut self) -> Rc<RefCell<Region>> {
        let new = Rc::new(RefCell::new(Region {
            subregion: [self.clone_from_container(),None],
            container: self.container.clone(),
        }));
        self.replace(new.clone());
        self.container = Some(Rc::downgrade(&new.clone()));
        new
    }
}

在我的实际代码中还有几个更多的函数,但这些只是长方法链的别名,用于打开RcRefCell的包装箱,使我能够实际获取数据.我尽量只讲重要的细节.

我排除的方法,Region::replaceRegion::from非常简单,它们的实现并不重要.replace走到container,用新的区域替换对self的引用(与clone_from_container非常相似,但改变了Region),from简单地在其containersubregions(0或1)内找到Region的索引.

当设置new中的subregion时,我希望能够说self.clone_from_container().or(Rc::clone(self))这样的东西,但显然这是不可能的,因为self被传递为类型.

我想这可能是一个静态工厂函数,而不是一个实例方法,所以我们可以用类型Rc<RefCell<Region>>传递self,但我也认为可能使用Rc::new_cyclic;然而,这个函数有点混乱,我不太确定如何使用它.

推荐答案

为了简单起见,我会说Rc<Region>而不是Rc<RefCell<Region>>

如果我理解正确的话,这就是你的情况:

let region = Region::new()
let rc = Rc::new(region)

你有一个方法,比如:

impl Region {
    fn my_function(&mut self) {
        // Here you want to somehow get a reference to `rc` (the Rc that contains this region)
    }
}

这是不可能的,因为Region不知道它在Rc里面.你必须以某种方式告诉它,它在Rc的内部.

一个可能的解决方案是不要使用self.例如:

impl Region {
    fn my_function(value: Rc<Self>) {
        // Now you have access to `rc`
    }
}

另一个 Select ,正如PitaJ建议的,是为Rc<Region>创建一个特性,在这种情况下,self就是Rc<Region>,所以你可以访问Rc.

Rust相关问答推荐

as操作符如何将enum转换为int?

把Vector3变成Vector4的绝妙方法

如何找到一个数字在二维数组中的位置(S)?

如何将元素添加到向量并返回对该元素的引用?

为什么复印是豆荚的一个重要特征?

为什么实例方法可以像Rust中的静态方法一样被调用?

捕获FnMut闭包的时间不够长

当发送方分配给静态时,Tokio MPSC关闭通道

解析程序无法在Cargo 发布中 Select 依赖版本

对reqwest提供的这种嵌套JSON struct 进行反序列化

我可以解构self 参数吗?

为什么 Rust 创建的 f32 小于 f32::MIN_POSITIVE?

如何在 Rust 中将函数项变成函数指针

方法可以被误认为是标准特性方法

Sized问题的动态调度迭代器Rust

将文件的第一行分别读取到文件的其余部分的最有效方法是什么?

如何制作具有关联类型的特征的类型擦除版本?

如何阅读 HttpRequest 主体

为什么一个整型变量赋值给另一个变量后仍然可以使用?

来自外部函数的future 内部可变引用