diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2021-11-27 11:46:40 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-11-27 11:46:40 +0100 |
| commit | 14ef447d1237a2534f3acc19a2f986b217ef274d (patch) | |
| tree | 4704930421982bb95024ac595c411f054a3cea1d | |
| parent | 84826fec957aa17b0e068775c1c5574f707d43b0 (diff) | |
| parent | 2ff677dcbe2228323553447054d130a0c4585a91 (diff) | |
| download | rust-14ef447d1237a2534f3acc19a2f986b217ef274d.tar.gz rust-14ef447d1237a2534f3acc19a2f986b217ef274d.zip | |
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.
| -rw-r--r-- | library/core/src/iter/traits/iterator.rs | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/library/core/src/iter/traits/iterator.rs b/library/core/src/iter/traits/iterator.rs index d957a7527cf..186a015510a 100644 --- a/library/core/src/iter/traits/iterator.rs +++ b/library/core/src/iter/traits/iterator.rs @@ -461,8 +461,10 @@ pub trait Iterator { /// 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 /// |
