引用相同类型但具有任何具体类型的通用结构
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
我不能简单地为我的结构提供另一个类型参数,因为引用的对象也可能引用另一个对象,依此类推。这样会导致类型参数非常多,不实用
我想找到一种方法来更改此实现以使其工作:
// 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"),
};
}
我的目的是创建一个结构,该结构保存对另一个类似类型但具有不同泛型的引用,以用作链接对象链。
问题是不允许使用 _
占位符编写:
the type placeholder `_` is not allowed within types on item signatures
我不能简单地为我的结构提供另一个类型参数,因为引用的对象也可能引用另一个对象,依此类推。这样会导致类型参数非常多,不实用
我想找到一种方法来更改此实现以使其工作:
// 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"),
};
}