假设我想将数字迭代器中的每个值加倍。我可以这么做:
vec![1, 2, 3]
.into_iter()
.map(|x| x * 2)
.for_each(|x| println!("{}", x)); //Prints 2, 4, 6.为了获得更清晰的代码,我更愿意这样做:
vec![1, 2, 3]
.into_iter()
.double() //I need to implement this.
.for_each(|x| println!("{}", x));如何编写自己的可链接迭代器函数,如本例中的double?我想我必须创建一个接口并为Iterator实现它?有很多类型需要纠正,所以为这个愚蠢的例子提供一个可行的解决方案将是有帮助的。
发布于 2019-01-27 16:46:29
首先,您必须创建一个新类型来实现您的迭代器。最简单的方法是包装您想要针对的类型的迭代器:
struct Double<T: ?Sized> {
inner: T,
}现在,如果innert类型Iterator的类型是正确的,那么您只需要为该类型实现T特性。类似于:
impl<T> Iterator for Double<T>
where T: Iterator<Item = i32> {
type Item = i32;
fn next(&mut self) -> Option<i32> {
self.inner.next().map(|x| 2*x)
}
}就这样!您只需添加一个Double构造函数即可。最符合人体工程学的解决方案是扩展Iterator。就像这样:
trait Doubler : Iterator<Item = i32> {
fn into_double(self) -> Double<Self>;
}
impl<T> Doubler for T
where T: Iterator<Item = i32> {
fn into_double(self) -> Double<Self> {
Double { inner: self }
}
}使用示例(游乐场):
fn main() {
vec![1, 2, 3]
.into_iter()
.into_double()
.for_each(|x| println!("{}", x));
}https://stackoverflow.com/questions/54390299
复制相似问题