首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解决锈病中需要相互引用的性状之间的循环依赖关系

解决锈病中需要相互引用的性状之间的循环依赖关系
EN

Stack Overflow用户
提问于 2021-10-04 09:30:15
回答 1查看 253关注 0票数 2

我有两个需要相互引用的结构。由于其他原因,这些结构需要同时绕过借用检查器。所以我有个包装器来绕过检查器。现在,我试图让每个结构都有第二个结构的泛型类型。

这是一个玩具例子:

代码语言:javascript
复制
use d2simrs::util::internalref::InternalRef;

pub trait Layer3Trait {
    fn foo() {
        println!("TraitA::foo()");
    }
}

pub trait Layer2Trait {
    fn bar() {
        println!("TraitB::foo()");
    }
}

pub struct SimpleLayer2<Layer3T>
    where Layer3T: Layer3Trait
{
    pub layer3: InternalRef<Layer3T>,
}

pub struct SimpleLayer3<Layer2T>
    where Layer2T: Layer2Trait
{
    pub layer2: InternalRef<Layer2T>,
}

pub type Layer2 = SimpleLayer2<Layer3>;
pub type Layer2Ref = InternalRef<Layer2>;

pub type Layer3 = SimpleLayer3<SimpleLayer2<Layer3>>;
pub type Layer3Ref = InternalRef<Layer3>;

InternalRef的代码是这里

我就能得到

代码语言:javascript
复制
   |
30 | pub type Layer3 = SimpleLayer3<SimpleLayer2<Layer3>>;
   |                                             ^^^^^^
   |
   = note: ...which again requires computing type of `example2::Layer3`, completing the cycle
note: cycle used when computing type of `example2::Layer2`
  --> examples/network/bypass_borrow/example2.rs:27:32
   |
27 | pub type Layer2 = SimpleLayer2<Layer3>;
   |                                ^^^^^^

我能不能重新定义一些东西,这样SimpleLayer2和SimpleLayer3就可以相互引用了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-11 19:30:15

锈病不支持循环的泛型类型。如果你有:

代码语言:javascript
复制
pub type Layer2 = SimpleLayer2<Layer3>;
pub type Layer3 = SimpleLayer3<Layer2>;

那么具体类型的Layer3将是:

代码语言:javascript
复制
SimpleLayer3<SimpleLayer2<SimpleLayer3<SimpleLayer2<SimpleLayer3<SimpleLayer2<SimpleLayer3<SimpleLayer2<SimpleLayer3<SimpleLayer2<SimpleLayer3<...>>>>>>>

这是不允许的。

正如评论中提到的那样,如果您的设计是传家宝式的,没有循环依赖,这将是理想的,因为它显然可以避免此类问题。但是,如果这不合适,解决这一问题的标准方法是使用Rc/Arc和特性对象,这也将避免内部*mut T包装器(如果需要可变时使用RefCell/RwLock ):

代码语言:javascript
复制
use std::rc::{Rc, Weak};

pub struct SimpleLayer2 {
    pub layer3: Weak<RefCell<dyn Layer3>>,
}

pub struct SimpleLayer3 {
    pub layer2: Rc<RefCell<dyn Layer2>>,
}

关于其他潜在想法,请参阅以下其他问题:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69433749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档