【发布时间】:2021-05-02 01:58:24
【问题描述】:
试图将 T 用作另一个泛型参数 this way 的特征的泛型参数:
pub trait Foo<T> {
fn foo() -> T;
}
struct Bar<T, F: Foo<T>> {
f: F,
}
fn main() {
}
失败:
error[E0392]: parameter `T` is never used
--> src/main.rs:5:12
|
5 | struct Bar<T, F: Foo<T>> {
| ^ unused parameter
|
= help: consider removing `T`, referring to it in a field, or using a marker such as `PhantomData`
编译器建议使用PhantomData:
use core::marker::PhantomData;
pub trait Foo<T> {
fn foo() -> T;
}
struct Bar<T, F: Foo<T>> {
f: F,
t: PhantomData<T>,
}
fn main() {
}
难道没有比创建一个具有奇怪名称特征的假字段更优雅的方法来处理这个问题吗?
【问题讨论】:
-
抽象地回答这个问题有点困难。
struct Bar应该具备哪些特性,是否应该实现trait Foo? -
不,它只需要一个实现 Foo 的字段。
-
重复问题中的答案实际上很糟糕。因此,每次实例化结构时都需要使用 PhantomType 实例化字段。