-
Notifications
You must be signed in to change notification settings - Fork 12.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
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 has picked a reviewer for you, use r? to override) |
Might as well just r? @steveklabnik |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
/// 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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Dylan-DPC OK, I removed the example. Do you want to review this now?
i could review it, but i would prefer @steveklabnik to have a final look at it |
This looks reasonable to me. |
Looks good to me, thanks! @bors: r+ rollup |
📌 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_ref
so we don't confuse readers with random differences.
cc @steveklabnik, who is the one that added the previous version of this example