rust Iterator combinator

Iterator中文翻译是迭代器,顾名思义,迭代器肯定记录了当前的迭代位置。
Iterator是我最喜欢的rust结构之一,因为它实现了很多方法,这些方法是可以相互组合的,大大减轻了开发者的工作量。

trait

Iterator
pub trait Iterator {
	/// The type of the elements being iterated over.
	type Item;
	
	/// Advances the iterator and returns the next value.
	fn next(&mut self) -> Option<Self::Item>;
}
FromIterator

FromIterator的作用是将iterator转换为具体类型,标准库中许多类型都实现了,FromIterator,常用的有StringVecHashMap

pub trait FromIterator<A>: Sized {
	/// Creates a value from an iterator.
	fn from_iter<T: IntoIterator<Item = A>>(iter: T) -> Self;
}
IntoIterator

有from就有to,IntoIterator的作用是将具体类型转化为Iterator,标准库中同样也有许多类型实现了IntoIterator

pub trait IntoIterator {
    /// The type of the elements being iterated over.
    #[stable(feature = "rust1", since = "1.0.0")]
    type Item;

    /// Which kind of iterator are we turning this into?
    #[stable(feature = "rust1", since = "1.0.0")]
    type IntoIter: Iterator<Item = Self::Item>;

	/// Creates an iterator from a value.
	fn into_iter(self) -> Self::IntoIter;
}

所有的实现了Iterator的类型自动实现了IntoIterator

impl<I: Iterator> IntoIterator for I {
    type Item = I::Item;
    type IntoIter = I;

    fn into_iter(self) -> I {
        self
    }
}

方法

map

map方法的作用是将每个Item传入到闭包执行。需要注意的是,map方法仅仅创建了Map,是惰性(lazy)的,需要调用next方法或者collect方法才能执行。

由于Map也实现了Iterator,所以可以继续调用Iterator的方法,将其组合起来。

fn map<B, F>(self, f: F) -> Map<Self, F>
where
    Self: Sized,
    F: FnMut(Self::Item) -> B,
{
    Map::new(self, f)
}

pub struct Map<I, F> {
    iter: I,
    f: F,
}

impl<B, I: Iterator, F> Iterator for Map<I, F>
where
    F: FnMut(I::Item) -> B
{
    type Item = B;

    #[inline]
    fn next(&mut self) -> Option<B> {
        self.iter.next().map(&mut self.f)
    }
}
flatten

flatten的作用是将1个ItemIterator<Item = B>Iterator展开,变成1个大号的Iterator<Item = B>

fn flatten(self) -> Flatten<Self>
where
    Self: Sized,
    Self::Item: IntoIterator,
{
    Flatten::new(self)
}
flat_map

flat_map就是mapflatten的合体。

fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
where
    Self: Sized,
    U: IntoIterator,
    F: FnMut(Self::Item) -> U,
{
    FlatMap::new(self, f)
}
filter

同理,filter方法创建了Filterfilter_map方法创建了FilterMapFilterFilterMap都实现了Iterator,调用next方法,就会迭代到下一个符合过滤条件的位置。
区别是filter的过滤条件闭包的返回值是boolfilter_mapOption

fn filter<P>(self, predicate: P) -> Filter<Self, P>
where
    Self: Sized,
    P: FnMut(&Self::Item) -> bool,
{
    Filter::new(self, predicate)
}

fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
where
    Self: Sized,
    F: FnMut(Self::Item) -> Option<B>,
{
    FilterMap::new(self, f)
}
fuse

fuse方法的作用是,确保Iterator.next()方法一旦返回None,后续调用都是返回None

fn fuse(self) -> Fuse<Self>
where
    Self: Sized,
{
    Fuse::new(self)
}

tips:
这在异步编程中尤为常见,futures库中select! 要求执行的future必须是FusedFutureFuse包裹的Future实现了FusedFuture

impl<Fut: Future> FusedFuture for Fuse<Fut> {
    fn is_terminated(&self) -> bool {
        self.inner.is_none()
    }
}
collect

collect方法的作用是将Iterator转化为具体类型,该类型必须实现FromIterator

fn collect<B: FromIterator<Self::Item>>(self) -> B
where
    Self: Sized,
{
    FromIterator::from_iter(self)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值