gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:16:04 24 4
gpt4 key购买 nike

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

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

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 的引用未知数据类型?该结构必须只知道直接父数据类型,而不是第二个父数据类型。

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

最佳答案

既然你不(事实上也不能)关心 parent 的 parent 的类型,通过特征引入抽象:

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

关于generics - 引用相同类型但具有任何具体类型的通用结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48288640/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com