我的目的是创建一个结构,该结构包含对另一个类似类型的引用,但具有不同的泛型,可用作链接对象链。
问题是不允许使用_
占位符来写这个:
the type placeholder `_` is not allowed within types on item signatures
我不能简单地给我的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
的引用?结构必须只知道直接父数据类型,而不是第二个父数据类型。
如果无法解决这个问题,您能否建议一个可行的不同实施方案?
答案 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"),
};
}