如何在不使用 dyn 的情况下将 Rust 中的挂件特征增加三倍?

How to triple pendent traits un Rust without using dyn?

我有三个相互依赖的特征,但我找不到不使用 dyn.

静态定义这些特征的方法

定义两个似乎很简单:

pub trait TA<B: TB<Self>> {
    fn getB() -> Option<B>;
}

pub trait TB<A: TA<Self>> {
    fn getA() -> Option<A>;

}

但是用三个特征定义类似的东西似乎是不可能的(下面的代码无法编译):

pub trait TA<B: TB, C: TC> {
    fn getB() -> Option<B>;
    fn getC() -> Option<C>;
}

pub trait TB<A: TA, C: TC> {
    fn getA() -> Option<A>;
    fn getC() -> Option<C>;
}

pub trait TC<A: TA, B: TB> {
    fn getA() -> Option<A>;
    fn getB() -> Option<B>;
}

换个思路好像比我想的要简单。

pub trait TA<B: TB<Self, C>, C: TC<Self, B>> {
    fn getB() -> Option<B>;
    fn getC() -> Option<C>;
}

pub trait TB<A: TA<Self, C>, C: TC<Self, A>> {
    fn getA() -> Option<A>;
    fn getC() -> Option<C>;
}

pub trait TC<A: TA<A, Self>, B: TB<B, Self>> {
    fn getA() -> Option<A>;
    fn getB() -> Option<B>;
}

编辑:@trenctl 解决方案看起来更干净

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=062b05bf63efb1b6bfb2575bf963ff62

trait Ta {
    type B: Tb<A = Self, C = Self::C>;
    type C: Tc<A = Self, B = Self::B>;
    fn get_b(&self) -> Option<Self::B>;
    fn get_c(&self) -> Option<Self::C>;
}

trait Tb {
    type A: Ta<B = Self, C = Self::C>;
    type C: Tc<B = Self, A = Self::A>;
    fn get_a(&self) -> Option<Self::A>;
    fn get_c(&self) -> Option<Self::C>;
}

trait Tc {
    type A: Ta<C = Self, B = Self::B>;
    type B: Tb<C = Self, A = Self::A>;
    fn get_a(&self) -> Option<Self::A>;
    fn get_b(&self) -> Option<Self::B>;
}