我有一个元组的向量。
我想要获取
现在我想扩展
尝试2
我试图明确返回`std::iter::Map`而不是`impl Iterator`。然而,由于相同的原因,这段代码也无法编译。
这段代码无法编译,因为闭包
如何从trait方法返回`std::iter::Map`?我不想使用`Box`。
let l = vec![(0, 1), (2, 3)];
我想要获取
std::iter::Map
,它可以提取每个元组的第一个元素。天真地说,这样做是可行的:let m: std::iter::Map<_, _> = l.iter().map(|e| e.0);
现在我想扩展
Iterator
,使得这个伪代码起作用:let m: std::iter::Map<_, _> = l.iter().tuple_first();
尝试 1
我试图返回 impl Iterator
:
trait TupleExtractor<'a, T1: 'a, T2: 'a>: Iterator<Item = &'a (T1, T2)> {
fn tuple_first(self) -> impl Iterator<Item = &'a T1>;
}
impl<'a, T1: 'a + Copy, T2: 'a, I> TupleExtractor<'a, T1, T2> for I
where
I: Iterator<Item = &'a (T1, T2)>,
{
fn tuple_first(self) -> impl Iterator<Item = &'a T1> {
self.map(|e| e.0)
}
}
这段代码无法编译,因为
`impl Trait` only allowed in function and inherent method return types, not in trait method return types
尝试2
我试图明确返回`std::iter::Map`而不是`impl Iterator`。然而,由于相同的原因,这段代码也无法编译。
trait TupleExtractor<'a, T1: 'a, T2: 'a>: Iterator<Item = &'a (T1, T2)> {
fn tuple_first(
self,
) -> std::iter::Map<impl Iterator<Item = &'a (T1, T2)>, impl FnMut(&'a (T1, T2)) -> T1>;
}
impl<'a, T1: 'a + Copy, T2: 'a, I> TupleExtractor<'a, T1, T2> for I
where
I: Iterator<Item = &'a (T1, T2)>,
{
fn tuple_first(self) -> std::iter::Map<I, impl FnMut(&'a (T1, T2)) -> T1> {
self.map(|e| e.0)
}
}
第三次尝试
由于第二次尝试失败的原因是我无法指定std::iter::Map
的类型参数,所以我尝试将它们作为类型参数:
trait TupleExtractor<'a, T1: 'a, T2: 'a, A, B>: Iterator<Item = &'a (T1, T2)> {
fn tuple_first(self) -> std::iter::Map<A, B>;
}
impl<'a, T1: 'a + Copy, T2: 'a, I, F> TupleExtractor<'a, T1, T2, I, F> for I
where
I: Iterator<Item = &'a (T1, T2)>,
F: FnMut(&'a (T1, T2)) -> T1,
{
fn tuple_first(self) -> std::iter::Map<I, F> {
self.map(|e: &'a (T1, T2)| e.0)
}
}
这段代码无法编译,因为闭包
|e: &'a (T1, T2)| e.0
的类型不是 F
。= note: expected type parameter `F`
found closure `[closure@src/main.rs:38:18: 38:35]`
= help: every closure has a distinct type and so could not always match the caller-chosen type of parameter `F`
如何从trait方法返回`std::iter::Map`?我不想使用`Box`。
impl Trait
之前得到稳定,那种情况下你会使用它们。 - undefined