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

时间:2018-01-16 19:39:00

标签: generics reference rust any

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

问题是不允许使用_占位符来写这个:

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

E0121

我不能简单地给我的struct另一个类型参数,因为引用的对象也可以引用另一个对象,依此类推。这将导致非常多的类型参数,这是不切实际的。

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

// 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>,
}

我不能简单地在这里添加一个参数,因为我要将它添加到结构中,这会导致添加类型参数的相同无限循环。

是否可以通过DataRouter数据类型保存对B的引用,该数据类型本身包含对具有未知数据类型的父DataRouter的引用?结构必须只知道直接父数据类型,而不是第二个父数据类型。

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

1 个答案:

答案 0 :(得分:2)

既然你没有(实际上也不能)关心父母父母的类型,那就通过一个特征引入抽象:

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"),
    };
}