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;