diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2022-12-14 10:31:04 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-12-14 10:31:04 +0100 |
| commit | a270aeee7f9148b2a1ede17d928bd9632ea362ba (patch) | |
| tree | 3c9fa9e846936d9bac491a51016652516a4861f2 | |
| parent | 309c469eece74cd9b83328d18302f1a177d0df7f (diff) | |
| parent | e0fd37dcf79c8624092ccd0e1463cd239074ec83 (diff) | |
| download | rust-a270aeee7f9148b2a1ede17d928bd9632ea362ba.tar.gz rust-a270aeee7f9148b2a1ede17d928bd9632ea362ba.zip | |
Rollup merge of #103644 - catlee:catlee/option-question-mark-docs, r=workingjubilee
Add docs for question mark operator for Option As a beginner learning rust, it took me a while to figure out what `?` was doing with Options. I think the documentation of this could be improved. I've used the question mark documentation from the `Result` type as a template here, and tried to come up with a simple example as well.
| -rw-r--r-- | library/core/src/option.rs | 44 | ||||
| -rw-r--r-- | library/core/src/result.rs | 7 |
2 files changed, 47 insertions, 4 deletions
diff --git a/library/core/src/option.rs b/library/core/src/option.rs index 505d964e518..39462dca4ff 100644 --- a/library/core/src/option.rs +++ b/library/core/src/option.rs @@ -72,6 +72,50 @@ //! } //! ``` //! +//! # The question mark operator, `?` +//! +//! Similar to the [`Result`] type, when writing code that calls many functions that return the +//! [`Option`] type, handling `Some`/`None` can be tedious. The question mark +//! operator, [`?`], hides some of the boilerplate of propagating values +//! up the call stack. +//! +//! It replaces this: +//! +//! ``` +//! # #![allow(dead_code)] +//! fn add_last_numbers(stack: &mut Vec<i32>) -> Option<i32> { +//! let a = stack.pop(); +//! let b = stack.pop(); +//! +//! match (a, b) { +//! (Some(x), Some(y)) => Some(x + y), +//! _ => None, +//! } +//! } +//! +//! ``` +//! +//! With this: +//! +//! ``` +//! # #![allow(dead_code)] +//! fn add_last_numbers(stack: &mut Vec<i32>) -> Option<i32> { +//! Some(stack.pop()? + stack.pop()?) +//! } +//! ``` +//! +//! *It's much nicer!* +//! +//! Ending the expression with [`?`] will result in the [`Some`]'s unwrapped value, unless the +//! result is [`None`], in which case [`None`] is returned early from the enclosing function. +//! +//! [`?`] can be used in functions that return [`Option`] because of the +//! early return of [`None`] that it provides. +//! +//! [`?`]: crate::ops::Try +//! [`Some`]: Some +//! [`None`]: None +//! //! # Representation //! //! Rust guarantees to optimize the following types `T` such that diff --git a/library/core/src/result.rs b/library/core/src/result.rs index 3f33c5fd6ca..f00c40f35d5 100644 --- a/library/core/src/result.rs +++ b/library/core/src/result.rs @@ -209,11 +209,10 @@ //! //! *It's much nicer!* //! -//! Ending the expression with [`?`] will result in the unwrapped -//! success ([`Ok`]) value, unless the result is [`Err`], in which case -//! [`Err`] is returned early from the enclosing function. +//! Ending the expression with [`?`] will result in the [`Ok`]'s unwrapped value, unless the result +//! is [`Err`], in which case [`Err`] is returned early from the enclosing function. //! -//! [`?`] can only be used in functions that return [`Result`] because of the +//! [`?`] can be used in functions that return [`Result`] because of the //! early return of [`Err`] that it provides. //! //! [`expect`]: Result::expect |
