Generics 将泛型参数与impl中的关联类型相匹配

Generics 将泛型参数与impl中的关联类型相匹配,generics,rust,Generics,Rust,我有一个关联类型和泛型结构的trait:: trait Generator { type Foo; fn generate(&self) -> Self::Foo; } struct Baz<A, B> where A: Generator, { generator: A, // will be some struct implementing Generator, but the exact type will vary ve

我有一个关联类型和泛型结构的trait::

trait Generator {
    type Foo;
    fn generate(&self) -> Self::Foo;
}

struct Baz<A, B>
where
    A: Generator,
{
    generator: A, // will be some struct implementing Generator, but the exact type will vary
    vec: Vec<B>,  // Each element will be A::Foo
}
哦!编译错误:

错误[E0308]:类型不匹配
-->src/main.rs:16:27
|
16 | self.vec.push(self.generator.generate());
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^所需的类型参数,找到了关联的类型
|
=注:应为'B'类型`
找到类型“::Foo”`
公平地说,我必须向编译器解释
B
A::Foo
相同;让我们尝试使用
where

impl<A: Generator, B> Baz<A, B>
where
    A::Foo = B,
{
嗯,不平等。也许我可以用冒号操作符来代替

impl<A: Generator, B> Baz<A, B>
where
    B: A::Foo,
{
不,现在它在抱怨
A
。也许我应该说发电机

impl<A: Generator, B> Baz<A, B>
where
    B: Generator::Foo,
{

干得好,编译器——这不是一种特质;它是一个关联类型,但这并没有告诉我如何编写与之匹配的where子句。

您可以去掉泛型参数
B
,而不是约束
B
,直接将
a::Foo
作为第二个泛型参数传递给
Baz
,但我不确定您的实际问题是否与您展示的简化示例相符

impl<A: Generator> Baz<A, A::Foo> {
    fn addFoo(&mut self)  {
        self.vec.push(self.generator.generate());
    }
}
impl Baz{
fn addFoo(&mut self){
self.vec.push(self.generator.generate());
}
}

诀窍在于只有一个通用参数:

trait Generator {
    type Foo;
    fn generate(&self) -> Self::Foo;
}

struct Baz<G>
where
    G: Generator,
{
    generator: G,
    vec: Vec<G::Foo>,
}

impl<G> Baz<G>
where
    G: Generator,
{
    fn add_foo(&mut self) {
        self.vec.push(self.generator.generate());
    }
}
特征生成器{
Foo型;
fn生成(&self)->self::Foo;
}
结构Baz
哪里
G:发电机,
{
发电机:G,
维克:维克,
}
impl Baz
哪里
G:发电机,
{
fn添加_foo(&mut self){
self.vec.push(self.generator.generate());
}
}
因为向量将包含
G::Foo
,我们实际上可以这么说

锈迹样式是
snake\u case
,因此我更新了它,并制作了类型参数
G
,以帮助读者

我必须向编译器解释
B
A::Foo

它有一种特殊的语法:

impl<A, B> Baz<A, B>
where
    A: Generator<Foo = B>,
{
    fn add_foo(&mut self) {
        self.vec.push(self.generator.generate());
    }
}
impl Baz
哪里
A:发电机,
{
fn添加_foo(&mut self){
self.vec.push(self.generator.generate());
}
}

您确定需要创建子类型生成器吗?我认为这是他要求的答案,而不是他想要的答案。谢谢,我不知道这个语法。
impl<A, B> Baz<A, B>
where
    A: Generator<Foo = B>,
{
    fn add_foo(&mut self) {
        self.vec.push(self.generator.generate());
    }
}