|
2 | 2 | //!
|
3 | 3 | //! [`Result<T, E>`][`Result`] is the type used for returning and propagating
|
4 | 4 | //! errors. It is an enum with the variants, [`Ok(T)`], representing success and
|
5 |
| -//! containing a value, and [`Err(E)`], representing error and containing an |
6 |
| -//! error value. |
| 5 | +//! success and containing a value, and [`Err(E)`], representing error |
| 6 | +//! and containing an error value. |
7 | 7 | //!
|
8 | 8 | //! ```
|
9 | 9 | //! # #[allow(dead_code)]
|
|
14 | 14 | //! ```
|
15 | 15 | //!
|
16 | 16 | //! Functions return [`Result`] whenever errors are expected and recoverable. In
|
17 |
| -//! the `std` crate, [`Result`] is most prominently used for |
18 |
| -//! [I/O](../../std/io/index.html). |
| 17 | +//! recoverable. In the `std` crate, [`Result`] is most prominently used |
| 18 | +//! for [I/O](../../std/io/index.html). |
19 | 19 | //!
|
20 |
| -//! A simple function returning [`Result`] might be defined and used like so: |
| 20 | +//! A simple function returning [`Result`] might be |
| 21 | +//! defined and used like so: |
21 | 22 | //!
|
22 | 23 | //! ```
|
23 | 24 | //! #[derive(Debug)]
|
|
40 | 41 | //! ```
|
41 | 42 | //!
|
42 | 43 | //! Pattern matching on [`Result`]s is clear and straightforward for simple
|
43 |
| -//! cases, but [`Result`] comes with some convenience methods that make working |
44 |
| -//! with it more succinct. |
| 44 | +//! simple cases, but [`Result`] comes with some convenience methods |
| 45 | +//! that make working with it more succinct. |
45 | 46 | //!
|
46 | 47 | //! ```
|
47 | 48 | //! let good_result: Result<i32, i32> = Ok(10);
|
|
67 | 68 | //!
|
68 | 69 | //! # Results must be used
|
69 | 70 | //!
|
70 |
| -//! A common problem with using return values to indicate errors is that it is |
71 |
| -//! easy to ignore the return value, thus failing to handle the error. |
72 |
| -//! [`Result`] is annotated with the `#[must_use]` attribute, which will cause |
73 |
| -//! the compiler to issue a warning when a Result value is ignored. This makes |
74 |
| -//! [`Result`] especially useful with functions that may encounter errors but |
75 |
| -//! don't otherwise return a useful value. |
| 71 | +//! A common problem with using return values to indicate errors is |
| 72 | +//! that it is easy to ignore the return value, thus failing to handle |
| 73 | +//! the error. [`Result`] is annotated with the `#[must_use]` attribute, |
| 74 | +//! which will cause the compiler to issue a warning when a Result |
| 75 | +//! value is ignored. This makes [`Result`] especially useful with |
| 76 | +//! functions that may encounter errors but don't otherwise return a |
| 77 | +//! useful value. |
76 | 78 | //!
|
77 |
| -//! Consider the [`write_all`] method defined for I/O types by the [`Write`] |
78 |
| -//! trait: |
| 79 | +//! Consider the [`write_all`] method defined for I/O types |
| 80 | +//! by the [`Write`] trait: |
79 | 81 | //!
|
80 | 82 | //! ```
|
81 | 83 | //! use std::io;
|
|
85 | 87 | //! }
|
86 | 88 | //! ```
|
87 | 89 | //!
|
88 |
| -//! *Note: The actual definition of [`Write`] uses [`io::Result`], which is just |
89 |
| -//! a synonym for <code>[Result]<T, [io::Error]></code>.* |
| 90 | +//! *Note: The actual definition of [`Write`] uses [`io::Result`], which |
| 91 | +//! is just a synonym for <code>[Result]<T, [io::Error]></code>.* |
90 | 92 | //!
|
91 |
| -//! This method doesn't produce a value, but the write may fail. It's crucial to |
92 |
| -//! handle the error case, and *not* write something like this: |
| 93 | +//! This method doesn't produce a value, but the write may |
| 94 | +//! fail. It's crucial to handle the error case, and *not* write |
| 95 | +//! something like this: |
93 | 96 | //!
|
94 | 97 | //! ```no_run
|
95 | 98 | //! # #![allow(unused_must_use)] // \o/
|
|
102 | 105 | //! file.write_all(b"important message");
|
103 | 106 | //! ```
|
104 | 107 | //!
|
105 |
| -//! If you *do* write that in Rust, the compiler will give you a warning (by |
106 |
| -//! default, controlled by the `unused_must_use` lint). |
| 108 | +//! If you *do* write that in Rust, the compiler will give you a |
| 109 | +//! warning (by default, controlled by the `unused_must_use` lint). |
107 | 110 | //!
|
108 |
| -//! You might instead, if you don't want to handle the error, simply assert |
109 |
| -//! success with [`expect`]. This will panic if the write fails, providing a |
110 |
| -//! marginally useful message indicating why: |
| 111 | +//! You might instead, if you don't want to handle the error, simply |
| 112 | +//! assert success with [`expect`]. This will panic if the |
| 113 | +//! write fails, providing a marginally useful message indicating why: |
111 | 114 | //!
|
112 | 115 | //! ```no_run
|
113 | 116 | //! use std::fs::File;
|
|
142 | 145 | //!
|
143 | 146 | //! # The question mark operator, `?`
|
144 | 147 | //!
|
145 |
| -//! When writing code that calls many functions that return the [`Result`] type, |
146 |
| -//! the error handling can be tedious. The question mark operator, [`?`], hides |
147 |
| -//! some of the boilerplate of propagating errors up the call stack. |
| 148 | +//! When writing code that calls many functions that return the |
| 149 | +//! [`Result`] type, the error handling can be tedious. The question mark |
| 150 | +//! operator, [`?`], hides some of the boilerplate of propagating errors |
| 151 | +//! up the call stack. |
148 | 152 | //!
|
149 | 153 | //! It replaces this:
|
150 | 154 | //!
|
|
205 | 209 | //!
|
206 | 210 | //! *It's much nicer!*
|
207 | 211 | //!
|
208 |
| -//! Ending the expression with [`?`] will result in the [`Ok`]'s unwrapped |
209 |
| -//! value, unless the result is [`Err`], in which case [`Err`] is returned early |
210 |
| -//! from the enclosing function. |
| 212 | +//! Ending the expression with [`?`] will result in the [`Ok`]'s unwrapped value, unless the result |
| 213 | +//! is [`Err`], in which case [`Err`] is returned early from the enclosing function. |
211 | 214 | //!
|
212 |
| -//! [`?`] can be used in functions that return [`Result`] because of the early |
213 |
| -//! return of [`Err`] that it provides. |
| 215 | +//! [`?`] can be used in functions that return [`Result`] because of the |
| 216 | +//! early return of [`Err`] that it provides. |
214 | 217 | //!
|
215 | 218 | //! [`expect`]: Result::expect
|
216 | 219 | //! [`Write`]: ../../std/io/trait.Write.html "io::Write"
|
217 |
| -//! [`write_all`]: ../../std/io/trait.Write.html#method.write_all |
218 |
| -//! "io::Write::write_all" |
| 220 | +//! [`write_all`]: ../../std/io/trait.Write.html#method.write_all "io::Write::write_all" |
219 | 221 | //! [`io::Result`]: ../../std/io/type.Result.html "io::Result"
|
220 | 222 | //! [`?`]: crate::ops::Try
|
221 | 223 | //! [`Ok(T)`]: Ok
|
|
250 | 252 | //!
|
251 | 253 | //! ## Querying the variant
|
252 | 254 | //!
|
253 |
| -//! The [`is_ok`] and [`is_err`] methods return [`true`] if the [`Result`] is |
254 |
| -//! [`Ok`] or [`Err`], respectively. |
| 255 | +//! In addition to working with pattern matching, [`Result`] provides a |
| 256 | +//! wide variety of different methods. |
255 | 257 | //!
|
256 | 258 | //! [`is_err`]: Result::is_err
|
257 | 259 | //! [`is_ok`]: Result::is_ok
|
|
261 | 263 | //! * [`as_ref`] converts from `&Result<T, E>` to `Result<&T, &E>`
|
262 | 264 | //! * [`as_mut`] converts from `&mut Result<T, E>` to `Result<&mut T, &mut E>`
|
263 | 265 | //! * [`as_deref`] converts from `&Result<T, E>` to `Result<&T::Target, &E>`
|
264 |
| -//! * [`as_deref_mut`] converts from `&mut Result<T, E>` to `Result<&mut |
265 |
| -//! T::Target, &mut E>` |
| 266 | +//! * [`as_deref_mut`] converts from `&mut Result<T, E>` to |
| 267 | +//! `Result<&mut T::Target, &mut E>` |
266 | 268 | //!
|
267 | 269 | //! [`as_deref`]: Result::as_deref
|
268 | 270 | //! [`as_deref_mut`]: Result::as_deref_mut
|
|
271 | 273 | //!
|
272 | 274 | //! ## Extracting contained values
|
273 | 275 | //!
|
274 |
| -//! These methods extract the contained value in a [`Result<T, E>`] when it is |
275 |
| -//! the [`Ok`] variant. If the [`Result`] is [`Err`]: |
| 276 | +//! These methods extract the contained value in a [`Result<T, E>`] when it |
| 277 | +//! is the [`Ok`] variant. If the [`Result`] is [`Err`]: |
276 | 278 | //!
|
277 | 279 | //! * [`expect`] panics with a provided custom message
|
278 | 280 | //! * [`unwrap`] panics with a generic message
|
279 | 281 | //! * [`unwrap_or`] returns the provided default value
|
280 |
| -//! * [`unwrap_or_default`] returns the default value of the type `T` (which |
281 |
| -//! must implement the [`Default`] trait) |
282 |
| -//! * [`unwrap_or_else`] returns the result of evaluating the provided function |
| 282 | +//! * [`unwrap_or_default`] returns the default value of the type `T` |
| 283 | +//! (which must implement the [`Default`] trait) |
| 284 | +//! * [`unwrap_or_else`] returns the result of evaluating the provided |
| 285 | +//! function |
283 | 286 | //!
|
284 |
| -//! The panicking methods [`expect`] and [`unwrap`] require `E` to implement the |
285 |
| -//! [`Debug`] trait. |
| 287 | +//! The panicking methods [`expect`] and [`unwrap`] require `E` to |
| 288 | +//! implement the [`Debug`] trait. |
286 | 289 | //!
|
287 | 290 | //! [`Debug`]: crate::fmt::Debug
|
288 | 291 | //! [`expect`]: Result::expect
|
|
291 | 294 | //! [`unwrap_or_default`]: Result::unwrap_or_default
|
292 | 295 | //! [`unwrap_or_else`]: Result::unwrap_or_else
|
293 | 296 | //!
|
294 |
| -//! These methods extract the contained value in a [`Result<T, E>`] when it is |
295 |
| -//! the [`Err`] variant. They require `T` to implement the [`Debug`] trait. If |
296 |
| -//! the [`Result`] is [`Ok`]: |
| 297 | +//! These methods extract the contained value in a [`Result<T, E>`] when it |
| 298 | +//! is the [`Err`] variant. They require `T` to implement the [`Debug`] |
| 299 | +//! trait. If the [`Result`] is [`Ok`]: |
297 | 300 | //!
|
298 | 301 | //! * [`expect_err`] panics with a provided custom message
|
299 | 302 | //! * [`unwrap_err`] panics with a generic message
|
|
308 | 311 | //!
|
309 | 312 | //! * [`err`][Result::err] transforms [`Result<T, E>`] into [`Option<E>`],
|
310 | 313 | //! mapping [`Err(e)`] to [`Some(e)`] and [`Ok(v)`] to [`None`]
|
311 |
| -//! * [`ok`][Result::ok] transforms [`Result<T, E>`] into [`Option<T>`], mapping |
312 |
| -//! [`Ok(v)`] to [`Some(v)`] and [`Err(e)`] to [`None`] |
313 |
| -//! * [`transpose`] transposes a [`Result`] of an [`Option`] into an [`Option`] |
314 |
| -//! of a [`Result`] |
| 314 | +//! * [`ok`][Result::ok] transforms [`Result<T, E>`] into [`Option<T>`], |
| 315 | +//! mapping [`Ok(v)`] to [`Some(v)`] and [`Err(e)`] to [`None`] |
| 316 | +//! * [`transpose`] transposes a [`Result`] of an [`Option`] into an |
| 317 | +//! [`Option`] of a [`Result`] |
315 | 318 | //!
|
316 | 319 | // Do NOT add link reference definitions for `err` or `ok`, because they
|
317 | 320 | // will generate numerous incorrect URLs for `Err` and `Ok` elsewhere, due
|
|
0 commit comments