Rust &引用;应为关联类型,找到“u32”;在where bound中将参数的生存期用作特征参数时

Rust &引用;应为关联类型,找到“u32”;在where bound中将参数的生存期用作特征参数时,rust,Rust,我试图编译这段代码(): 然后我可以在next()的主体中说Self::Item::from(0u32)。() 我想很清楚为什么next()中的错误消失了:U32Family::from总是将u32作为参数。硬编码。永不改变。关于此解决方案的更大问题是:from()方法为什么编译得很好?因此,在from()中,编译器不知何故知道任何的::Out。然而,我认为这不是问题所在 首先,impls可以被专门化。我没有这样做,所以我应该能够假设关联的类型实际上是u32()。但除此之外,专业化是基于生命周期

我试图编译这段代码():

然后我可以在
next()
的主体中说
Self::Item::from(0u32)
。()

我想很清楚为什么
next()
中的错误消失了:
U32Family::from
总是将
u32
作为参数。硬编码。永不改变。关于此解决方案的更大问题是:
from()
方法为什么编译得很好?因此,在
from()
中,编译器不知何故知道任何
::Out
。然而,我认为这不是问题所在

首先,impls可以被专门化。我没有这样做,所以我应该能够假设关联的类型实际上是
u32
()。但除此之外,专业化是基于生命周期的

所以现在我倾向于认为这是一个编译器错误。但我很想得到另一个答案

struct U32Family;
...
impl Iterator for Foo {
type Item = U32Family;
因此next()必须返回
选项
,其唯一可能的值是
None
Some(U32Family{})


你可能想要
Item=我认为问题在于
>::Out
是“巧合”。该方法的主体完全在
'a
的范围内,因此编译器可以证明该
'a
的转换是类型正确的,因此该方法是类型正确的。然后,在调用站点,您告诉编译器使用其关于方法的知识。

您可以让它将trait一分为二进行编译:
trait FamilyBase{type Out;}
定义类型,以及
traitFamily@rodrigo谢谢你的主意!这种方法的问题在于,实现者需要能够在
Out
类型中使用生存期参数。类似于
impl for Bar{type Out=&'a bool;}
。我明白了,你的两个特点的想法是不可能的。如何:将此函数添加到
trait Family
fn zero()->Self::Out。然后在
迭代器::next()
中调用
@rodrigo,我只是编辑了我的问题,因为我显然在这方面不够清楚:我并不总是想返回0,但不知怎么计算它。实际上,我并不总是想要
u32
,而是任意类型。因此,“返回类型的某个值”(如
zero()
does)并不总是有效。如果您将trait约束从
next
函数转移到整个
Iterator
trait(即
类型项:family我问题中的
迭代器
特征是自制的,不是来自
std
的官方特征。在我的特征中,我不返回
选项
,而是相关的
输出
类型。在任何情况下,出于几个原因,我不能只使用
静态
。但感谢您的回答:)!如果你感兴趣,我的问题是在写作时提出来的。这应该可以解释我奇怪的要求。
impl U32Family {
    fn from<'a>(v: u32) -> <Self as Family<'a>>::Out {
        v
    }
}
impl Family<'static> for U32Family {
    type Out = char;
}
struct U32Family;
...
impl Iterator for Foo {
type Item = U32Family;