【问题标题】:Generic struct with a reference to the same type but with any concrete type引用相同类型但具有任何具体类型的通用结构
【发布时间】:2023-03-22 07:58:01
【问题描述】:

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

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

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 做什么,需要你知道它的父母的类型?
  • 我的意图是能够让父级将 DataRouters 用作链。基本上我只是希望能够使用getter 方法返回parent,这样我就可以从构建链的地方使用它。每个 DataRouter 都会在那里处理数据并返回它;然后将数据传递给最后一个路由器的父级,并再次进行处理;以此类推,直到链结束(无而不是Some(parent))。

标签: generics reference rust any


【解决方案1】:

由于您不(并且确实不能)关心父级父级的类型,因此通过 trait 引入抽象:

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

【讨论】:

  • 正是我想要的。我不知道你是如何在 30 秒内正确回答的,但它确实有效。现在我知道如何更好地处理 Rust 特征系统。干得好
  • 只是好奇为什么我们需要Parent 特质?即使没有它,它也会起作用。是否只是为了确保没有其他 type 进入 DataRouterparent 字段 - 除了 DataRouterNil
猜你喜欢
  • 1970-01-01
  • 2019-05-04
  • 1970-01-01
  • 2016-02-23
  • 2020-01-04
  • 2021-11-11
  • 2013-03-03
  • 1970-01-01
  • 2013-03-28
相关资源
最近更新 更多