Uh oh!
There was an error while loading. Please reload this page.
Improve Iterator::by_ref example - #80805
Conversation
I split the example into two: one that fails to compile, and one that works. I also made them identical except for the addition of `by_ref` so we don't confuse readers with random differences.
rust-highfive
commented
Jan 8, 2021
(rust-highfive has picked a reviewer for you, use r? to override) |
camelid
commented
Jan 8, 2021
Might as well just r? @steveklabnik |
Uh oh!
There was an error while loading. Please reload this page.
steveklabnik
left a comment
There was a problem hiding this comment.
Thanks for this! I think some of this is excellent, some of it feels like churn, and some of it moves us away from standard constructs.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
| /// This demonstrates a use case that needs `by_ref`: | ||
| /// | ||
| /// ```compile_fail,E0382 | ||
| /// let a = [1, 2, 3, 4, 5]; | ||
| /// let mut iter = a.iter(); | ||
| /// | ||
| /// let sum: i32 = iter.take(3).fold(0, |acc, i| acc + i); | ||
| /// assert_eq!(sum, 6); | ||
| /// | ||
| /// // if we try to use iter again, it won't work. The following line | ||
| /// // gives "error: use of moved value: `iter` | ||
| /// // assert_eq!(iter.next(), None); | ||
| /// // Error! We can't use `iter` again because it was moved | ||
| /// // by `take`. | ||
| /// assert_eq!(iter.next(), Some(&4)); | ||
| /// ``` | ||
| /// | ||
| /// // let's try that again | ||
| /// let a = [1, 2, 3]; | ||
| /// Now, let's use `by_ref` to make this work: | ||
| /// | ||
| /// ``` | ||
| /// let a = [1, 2, 3, 4, 5]; | ||
| /// let mut iter = a.iter(); | ||
| /// | ||
| /// // instead, we add in a .by_ref() | ||
| /// let sum: i32 = iter.by_ref().take(2).fold(0, |acc, i| acc + i); | ||
| /// | ||
| /// assert_eq!(sum, 3); | ||
| /// // We add in a call to `by_ref` here so `iter` isn't moved. | ||
| /// let sum: i32 = iter.by_ref().take(3).fold(0, |acc, i| acc + i); | ||
| /// assert_eq!(sum, 6); | ||
| /// | ||
| /// // now this is just fine: | ||
| /// assert_eq!(iter.next(), Some(&3)); | ||
| /// assert_eq!(iter.next(), None); | ||
| /// // And now we can use `iter` again because we still own it. | ||
| /// assert_eq!(iter.next(), Some(&4)); | ||
| /// ``` |
There was a problem hiding this comment.
At this point, should I just remove the later example? I don't feel like it adds much that the basic usage example doesn't show.
There was a problem hiding this comment.
@camelid do youw ant to update this without the last example? looks good enough to me without it
There was a problem hiding this comment.
@Dylan-DPC OK, I removed the example. Do you want to review this now?
Dylan-DPC-zz
commented
Apr 5, 2021
i could review it, but i would prefer @steveklabnik to have a final look at it |
joshtriplett
commented
Apr 21, 2021
This looks reasonable to me. |
steveklabnik
commented
Apr 23, 2021
Looks good to me, thanks! @bors: r+ rollup |
bors
commented
Apr 23, 2021
📌 Commit 49ccc3f has been approved by |
Rollup of 11 pull requests Successful merges: - rust-lang#80805 (Improve `Iterator::by_ref` example) - rust-lang#84248 (Remove duplicated fn(Box<[T]>) -> Vec<T>) - rust-lang#84321 (rustdoc: Convert sub-variant toggle to HTML) - rust-lang#84359 (:arrow_up: rust-analyzer) - rust-lang#84374 (Clean up .gitignore) - rust-lang#84387 (Move `sys_common::poison` to `sync::poison`) - rust-lang#84430 (doc/platform-support: clarify UEFI support) - rust-lang#84433 (Prevent control, shift and alt keys to make search input lose focus) - rust-lang#84444 (doc: Get rid of "[+] show undocumented items" toggle on numeric From impls) - rust-lang#84456 (Fix ICE if original_span(fn_sig) returns a span not in body sourcefile) - rust-lang#84469 (Update comment on `PrimTy::name_str`) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
I split the example into two: one that fails to compile, and one that
works. I also made them identical except for the addition of
by_refso we don't confuse readers with random differences.
cc @steveklabnik, who is the one that added the previous version of this example