我有一个特点它说的Foo
任何实施需要提供一种方法bar
它返回某种类型的,它实现Iterator<Item = u32>
的目的:性状与寿命由一个参数的寿命有界返回迭代
trait Foo {
type FooIterator: Iterator<Item = u32>;
fn bar(&self) -> FooIterator;
}
对于这种情况,我相信默认的生存期限elision意味着由bar
返回的迭代器需要独立生存,而不必受限于它正在迭代的Foo
的生命周期。 #rust irc上的用户Habnabit建议以下方式说明FooIterator
的使用期限低于Foo
的使用期限。也就是说,它允许FooIterator
的执行,以保持到它来自Foo
参考:
trait Foo<'a> {
type FooIterator: Iterator<Item = u32> + 'a;
fn bar<'b: 'a>(&'b self) -> Self::FooIterator;
}
我真正想要的是函数bar
需要一个额外的参数的情况下,和FooIterator
实现被允许以保留对Foo
和附加参数的引用。即FooIterator
的生存期由Foo
的生存期和附加参数的生存期限定。
我这种想法的直译是
trait Zip {}
trait Foo<'a, 'c> {
type FooIterator: Iterator<Item = u32> + 'a + 'c;
// Foo.bar() returns an iterator that has a lifetime less than the Foo
fn bar<'b: 'a, 'd: 'c>(&'b self, &'d Zip) -> Self::FooIterator;
}
但有人告诉我,有没有“好”的方式做到这一点。实施这个习语最好的方法是什么?上面的代码会做什么?
每当我问一个Rust问题时,你都必须有一个提示:)有趣的,但它似乎不像关联类型的构造函数将很快在Rust中。解决方法是什么? –
我在看着https://stackoverflow.com/questions/tagged/rust,我并不孤单。 ;)据我所知,没有解决方法,这就是为什么这个功能正在开发过程中。 –