引用相同类型但具有任何具体类型的通用结构

Generic struct with a reference to the same type but with any concrete type

我的目的是创建一个结构,该结构保存对另一个类似类型但具有不同泛型的引用,以用作链接对象链。

问题是不允许使用 _ 占位符编写:

the type placeholder `_` is not allowed within types on item
signatures

E0121

我不能简单地为我的结构提供另一个类型参数,因为引用的对象也可能引用另一个对象,依此类推。这样会导致类型参数非常多,不实用

我想找到一种方法来更改此实现以使其工作:

// The type parameters are:
// O: this Router's data type
// B: The parent router's data type
pub struct DataRouter<'a, O, B = O>
where
    O: 'a,
    B: 'a,
{
    parent: Option<&'a DataRouter<'a, B, _>>, // Here the problem `_`
    range: Option<Range<usize>>,
    data: Option<O>,
}

我不能简单地将参数放在这里,因为我必须将它添加到结构中,这将导致添加类型参数的无限循环。

有没有办法保存对具有 B 数据类型的 DataRouter 的引用,而该数据类型本身保存对具有未知数据类型的父 DataRouter 的引用?该结构必须只知道直接父数据类型,而不是第二个父数据类型。

如果无法解决这个问题,您能否建议一个可行的不同实施方式?

既然你不(也确实不能)关心父的父的类型,那么通过一个特征引入抽象:

trait Parent {}

struct Nil;
impl Parent for Nil {}

pub struct DataRouter<'a, T, P>
where
    P: 'a,
{
    parent: Option<&'a P>,
    data: Option<T>,
}

impl<'a, T, P> Parent for DataRouter<'a, T, P> {}

fn main() {
    let a = DataRouter {
        parent: None::<&'static Nil>,
        data: Some(true),
    };
    let b = DataRouter {
        parent: Some(&a),
        data: Some(42),
    };
    let c = DataRouter {
        parent: Some(&b),
        data: Some("moo"),
    };
}