Rust 限制泛型参数的泛型参数

Rust limit generic parameter of generic parameter

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

我想声明一个 'internal node' 结构,其中包含一组相同的类型,每个实现节点都用于相同的类型。如果 Node 不是通用的,我会这样声明:

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

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

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

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

必须使用在结构上定义的泛型参数,您可以通过添加 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);