mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-25 21:34:18 +00:00
Add function core::iter::zip
This makes it a little easier to `zip` iterators: ```rust for (x, y) in zip(xs, ys) {} // vs. for (x, y) in xs.into_iter().zip(ys) {} ``` You can `zip(&mut xs, &ys)` for the conventional `iter_mut()` and `iter()`, respectively. This can also support arbitrary nesting, where it's easier to see the item layout than with arbitrary `zip` chains: ```rust for ((x, y), z) in zip(zip(xs, ys), zs) {} for (x, (y, z)) in zip(xs, zip(ys, zs)) {} // vs. for ((x, y), z) in xs.into_iter().zip(ys).zip(xz) {} for (x, (y, z)) in xs.into_iter().zip((ys.into_iter().zip(xz)) {} ``` It may also format more nicely, especially when the first iterator is a longer chain of methods -- for example: ```rust iter::zip( trait_ref.substs.types().skip(1), impl_trait_ref.substs.types().skip(1), ) // vs. trait_ref .substs .types() .skip(1) .zip(impl_trait_ref.substs.types().skip(1)) ``` This replaces the tuple-pair `IntoIterator` in rust-lang/rust#78204. There is prior art for the utility of this in [`itertools::zip`]. [`itertools::zip`]: https://docs.rs/itertools/0.10.0/itertools/fn.zip.html
This commit is contained in:
parent
e423058751
commit
b362958453
@ -51,6 +51,9 @@ pub use self::map_while::MapWhile;
|
||||
#[unstable(feature = "trusted_random_access", issue = "none")]
|
||||
pub use self::zip::TrustedRandomAccess;
|
||||
|
||||
#[unstable(feature = "iter_zip", issue = "none")]
|
||||
pub use self::zip::zip;
|
||||
|
||||
/// This trait provides transitive access to source-stage in an interator-adapter pipeline
|
||||
/// under the conditions that
|
||||
/// * the iterator source `S` itself implements `SourceIter<Source = S>`
|
||||
|
@ -5,8 +5,8 @@ use crate::iter::{InPlaceIterable, SourceIter, TrustedLen};
|
||||
|
||||
/// An iterator that iterates two other iterators simultaneously.
|
||||
///
|
||||
/// This `struct` is created by [`Iterator::zip`]. See its documentation
|
||||
/// for more.
|
||||
/// This `struct` is created by [`zip`] or [`Iterator::zip`].
|
||||
/// See their documentation for more.
|
||||
#[derive(Clone)]
|
||||
#[must_use = "iterators are lazy and do nothing unless consumed"]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
@ -33,6 +33,37 @@ impl<A: Iterator, B: Iterator> Zip<A, B> {
|
||||
}
|
||||
}
|
||||
|
||||
/// Converts the arguments to iterators and zips them.
|
||||
///
|
||||
/// See the documentation of [`Iterator::zip`] for more.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(iter_zip)]
|
||||
/// use std::iter::zip;
|
||||
///
|
||||
/// let xs = [1, 2, 3];
|
||||
/// let ys = [4, 5, 6];
|
||||
/// for (x, y) in zip(&xs, &ys) {
|
||||
/// println!("x:{}, y:{}", x, y);
|
||||
/// }
|
||||
///
|
||||
/// // Nested zips are also possible:
|
||||
/// let zs = [7, 8, 9];
|
||||
/// for ((x, y), z) in zip(zip(&xs, &ys), &zs) {
|
||||
/// println!("x:{}, y:{}, z:{}", x, y, z);
|
||||
/// }
|
||||
/// ```
|
||||
#[unstable(feature = "iter_zip", issue = "none")]
|
||||
pub fn zip<A, B>(a: A, b: B) -> Zip<A::IntoIter, B::IntoIter>
|
||||
where
|
||||
A: IntoIterator,
|
||||
B: IntoIterator,
|
||||
{
|
||||
ZipImpl::new(a.into_iter(), b.into_iter())
|
||||
}
|
||||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl<A, B> Iterator for Zip<A, B>
|
||||
where
|
||||
|
@ -389,6 +389,8 @@ pub use self::traits::{
|
||||
DoubleEndedIterator, ExactSizeIterator, Extend, FromIterator, IntoIterator, Product, Sum,
|
||||
};
|
||||
|
||||
#[unstable(feature = "iter_zip", issue = "none")]
|
||||
pub use self::adapters::zip;
|
||||
#[stable(feature = "iter_cloned", since = "1.1.0")]
|
||||
pub use self::adapters::Cloned;
|
||||
#[stable(feature = "iter_copied", since = "1.36.0")]
|
||||
|
Loading…
Reference in New Issue
Block a user