【问题标题】:Rust limit generic parameter of generic parameterRust 限制泛型参数的泛型参数
【发布时间】:2021-07-04 20:57:44
【问题描述】:

我已经定义了一个 trait Node<T: Ord + Eq + std::fmt::Debug> 来为树的节点提供标准操作 - 我最初使用的是枚举,但我认为这种方法会更灵活一些,并减少一些冗长。

我想声明一个“内部节点”结构,其中包含一组相同的类型,每个实现节点都对应相同的类型。如果 Node 不是通用的,我会这样声明:

struct InternalNode<T: Node>(Vec<T>);

但是因为 Node 是泛型的,我需要引入另一个类型参数,看起来像这样:

struct InternalNode<E: Ord + Eq + std::fmt::Debug, T: Node<E>>(
    Vec<T>,
);

使用该解决方案,编译器抱怨 E 未使用,尽管我在类型参数 T 的声明中使用了它。我假设我只是错误地猜测了这种行为的语法,有人可以帮助我吗?谢谢!

【问题讨论】:

    标签: rust type-parameter nested-generics


    【解决方案1】:

    必须使用在结构上定义的泛型参数,您可以通过添加 PhantomData 字段将其标记为已使用,这种情况下是零大小的泛型类型。

    use std::marker::PhantomData;
    
    pub trait Node<T> { }
    
    struct InternalNode<E: Ord + Eq + std::fmt::Debug, T: Node<E>>(
        Vec<T>, 
        PhantomData::<E>,
    );
    

    然后你可以这样构造它:

    InternalNode(vec![someNode, someOtherNode], PhantomData);
    

    【讨论】:

      猜你喜欢
      • 2021-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-06
      • 1970-01-01
      • 2017-11-17
      • 2023-03-20
      相关资源
      最近更新 更多