【问题标题】:如何指定嵌套的泛型类型
【发布时间】:2022-01-20 10:34:44
【问题描述】:

我正在尝试创建一个结构,其中包含一个项目数组,每个项目都有一个关联的名称和值。我在这里使用结构而不是数组,因为一旦我让这部分工作,我可能想向结构添加额外的字段。

我想出了以下内容:

pub trait Named {
    fn name(&self) -> &str;
}

pub trait Valued<T> {
    fn value(&self) -> &T;
}

pub struct ValuedEnum<T, D, const N: usize>
where
    T: Named + Valued<D>,
{
    options: [T; N],
}

编译时会生成此错误消息:

error[E0392]: parameter `D` is never used
  --> src\inputs\definition\macros.rs:68:26
   |
68 | pub struct ValuedEnum<T, D, const N: usize>
   |                          ^ unused parameter
   |
   = help: consider removing `D`, referring to it in a field, or using a marker such as `PhantomData`
   = help: if you intended `D` to be a const parameter, use `const D: usize` instead

所以我尝试删除 D:

pub trait Named {
    fn name(&self) -> &str;
}

pub trait Valued<T> {
    fn value(&self) -> &T;
}

pub struct ValuedEnum<T, const N: usize>
where
    T: Named + Valued<D>,
{
    options: [T; N],
}

但后来我得到了这个错误:

error[E0412]: cannot find type `D` in this scope
  --> src\inputs\definition\macros.rs:70:23
   |
68 | pub struct ValuedEnum<T, const N: usize>
   |                       - similarly named type parameter `T` defined here
69 | where
70 |     T: Named + Valued<D>,
   |                       ^
   |
help: a type parameter with a similar name exists
   |
70 |     T: Named + Valued<T>,
   |                       ~
help: you might be missing a type parameter
   |
68 | pub struct ValuedEnum<T, const N: usize, D>
   |                                        +++

这似乎让我陷入了困境。

有没有正确的方法来指定这个?

【问题讨论】:

  • 大部分是的。但是下面的@jmb 提到我应该完全避免对结构设置界限

标签: generics struct rust


【解决方案1】:

看来正确的答案可能是这样的:

pub trait Named {
    fn name(&self) -> &str;
}

pub trait Valued<T> {
    fn value(&self) -> &T;
}

pub struct ValuedEnum<T,D, const N: usize>
where
    T: Named + Valued<D>,
{
    options: [T; N],
    phantom: PhantomData<D>,
}

PhantomData 是一个大小为零的标记,告诉编译器我确实需要类型 D

或者使用关联类型:

pub trait Named {
    fn name(&self) -> &str;
}

pub trait Valued {
    type Return;
    fn value(&self) -> &Self::Return;
}

pub struct ValuedEnum<T, const N: usize>
where
    T: Named + Valued,
{
    options: [T; N],
}

【讨论】:

  • 实际上你可能不应该对struct 声明设置界限:struct ValuedEnum&lt;T, const N: usize&gt; {…}。见:stackoverflow.com/questions/49229332/…
  • 好的。那么如何在不使用类型绑定的情况下实现预期的功能呢?如果我在某处传递 ValuedEnum,是否需要绑定以便 ValuedEnum 的使用者知道可以在数组中的项目上调用 name() 和 value() 方法?
  • 您阅读我发布的链接了吗?除非你知道自己在做什么,否则你应该把边界放在 impl 块上,not 放在 struct 声明上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-10
  • 1970-01-01
  • 2023-01-10
  • 2020-01-01
  • 1970-01-01
相关资源
最近更新 更多