mirror of
https://github.com/rust-lang/rust.git
synced 2026-05-30 13:06:28 +03:00
Rollup merge of #83791 - the8472:relax-zip-side-effect-guarantee, r=dtolnay
Weaken guarantee around advancing underlying iterators in zip The current guarantee (introduced in #52279) is too strong as it prevents adapters from exploiting knowledge about the iterator length and using counted loops for example because they would stop calling `next()` before it ever returned `None`. Additionally several nested zip iterators already fail to uphold this. This does not yet remove any of the specialization code that tries (and sometimes fails) to uphold the guarantee for `next()` because removing it would also affect `next_back()` in more surprising ways. The intent is to be able to remove for example this branch https://github.com/rust-lang/rust/blob/36bcf4069717b9dff90270d13b53a3b130329960/library/core/src/iter/adapters/zip.rs#L234-L243 or this test https://github.com/rust-lang/rust/blob/36bcf4069717b9dff90270d13b53a3b130329960/library/core/tests/iter/adapters/zip.rs#L177-L188 Solves #82303 by declaring it a non-issue.
This commit is contained in:
@@ -461,8 +461,10 @@ fn chain<U>(self, other: U) -> Chain<Self, U::IntoIter>
|
||||
/// In other words, it zips two iterators together, into a single one.
|
||||
///
|
||||
/// If either iterator returns [`None`], [`next`] from the zipped iterator
|
||||
/// will return [`None`]. If the first iterator returns [`None`], `zip` will
|
||||
/// short-circuit and `next` will not be called on the second iterator.
|
||||
/// will return [`None`].
|
||||
/// If the zipped iterator has no more elements to return then each further attempt to advance
|
||||
/// it will first try to advance the first iterator at most one time and if it still yielded an item
|
||||
/// try to advance the second iterator at most one time.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
|
||||
Reference in New Issue
Block a user