rsult 1.3.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +7 -6
- package/readme.md +161 -5
- package/rust/option.rs +2822 -0
- package/rust/result.rs +2207 -0
- package/src/lib.ts +3 -1
- package/src/option-async.test.ts +410 -0
- package/src/option-async.ts +467 -0
- package/src/option.test.ts +101 -0
- package/src/option.ts +480 -266
- package/src/result-async.test.ts +485 -0
- package/src/result-async.ts +635 -0
- package/src/result.test.ts +36 -0
- package/src/result.ts +418 -340
- package/src/types.test.ts +409 -0
- package/dist/lib.d.ts +0 -2
- package/dist/lib.js +0 -19
- package/dist/lib.js.map +0 -1
- package/dist/option.d.ts +0 -307
- package/dist/option.js +0 -195
- package/dist/option.js.map +0 -1
- package/dist/result.d.ts +0 -410
- package/dist/result.js +0 -231
- package/dist/result.js.map +0 -1
package/rust/option.rs
ADDED
|
@@ -0,0 +1,2822 @@
|
|
|
1
|
+
//! Optional values.
|
|
2
|
+
//!
|
|
3
|
+
//! Type [`Option`] represents an optional value: every [`Option`]
|
|
4
|
+
//! is either [`Some`] and contains a value, or [`None`], and
|
|
5
|
+
//! does not. [`Option`] types are very common in Rust code, as
|
|
6
|
+
//! they have a number of uses:
|
|
7
|
+
//!
|
|
8
|
+
//! * Initial values
|
|
9
|
+
//! * Return values for functions that are not defined
|
|
10
|
+
//! over their entire input range (partial functions)
|
|
11
|
+
//! * Return value for otherwise reporting simple errors, where [`None`] is
|
|
12
|
+
//! returned on error
|
|
13
|
+
//! * Optional struct fields
|
|
14
|
+
//! * Struct fields that can be loaned or "taken"
|
|
15
|
+
//! * Optional function arguments
|
|
16
|
+
//! * Nullable pointers
|
|
17
|
+
//! * Swapping things out of difficult situations
|
|
18
|
+
//!
|
|
19
|
+
//! [`Option`]s are commonly paired with pattern matching to query the presence
|
|
20
|
+
//! of a value and take action, always accounting for the [`None`] case.
|
|
21
|
+
//!
|
|
22
|
+
//! ```
|
|
23
|
+
//! fn divide(numerator: f64, denominator: f64) -> Option<f64> {
|
|
24
|
+
//! if denominator == 0.0 {
|
|
25
|
+
//! None
|
|
26
|
+
//! } else {
|
|
27
|
+
//! Some(numerator / denominator)
|
|
28
|
+
//! }
|
|
29
|
+
//! }
|
|
30
|
+
//!
|
|
31
|
+
//! // The return value of the function is an option
|
|
32
|
+
//! let result = divide(2.0, 3.0);
|
|
33
|
+
//!
|
|
34
|
+
//! // Pattern match to retrieve the value
|
|
35
|
+
//! match result {
|
|
36
|
+
//! // The division was valid
|
|
37
|
+
//! Some(x) => println!("Result: {x}"),
|
|
38
|
+
//! // The division was invalid
|
|
39
|
+
//! None => println!("Cannot divide by 0"),
|
|
40
|
+
//! }
|
|
41
|
+
//! ```
|
|
42
|
+
//!
|
|
43
|
+
//
|
|
44
|
+
// FIXME: Show how `Option` is used in practice, with lots of methods
|
|
45
|
+
//
|
|
46
|
+
//! # Options and pointers ("nullable" pointers)
|
|
47
|
+
//!
|
|
48
|
+
//! Rust's pointer types must always point to a valid location; there are
|
|
49
|
+
//! no "null" references. Instead, Rust has *optional* pointers, like
|
|
50
|
+
//! the optional owned box, <code>[Option]<[Box\<T>]></code>.
|
|
51
|
+
//!
|
|
52
|
+
//! [Box\<T>]: ../../std/boxed/struct.Box.html
|
|
53
|
+
//!
|
|
54
|
+
//! The following example uses [`Option`] to create an optional box of
|
|
55
|
+
//! [`i32`]. Notice that in order to use the inner [`i32`] value, the
|
|
56
|
+
//! `check_optional` function first needs to use pattern matching to
|
|
57
|
+
//! determine whether the box has a value (i.e., it is [`Some(...)`][`Some`]) or
|
|
58
|
+
//! not ([`None`]).
|
|
59
|
+
//!
|
|
60
|
+
//! ```
|
|
61
|
+
//! let optional = None;
|
|
62
|
+
//! check_optional(optional);
|
|
63
|
+
//!
|
|
64
|
+
//! let optional = Some(Box::new(9000));
|
|
65
|
+
//! check_optional(optional);
|
|
66
|
+
//!
|
|
67
|
+
//! fn check_optional(optional: Option<Box<i32>>) {
|
|
68
|
+
//! match optional {
|
|
69
|
+
//! Some(p) => println!("has value {p}"),
|
|
70
|
+
//! None => println!("has no value"),
|
|
71
|
+
//! }
|
|
72
|
+
//! }
|
|
73
|
+
//! ```
|
|
74
|
+
//!
|
|
75
|
+
//! # The question mark operator, `?`
|
|
76
|
+
//!
|
|
77
|
+
//! Similar to the [`Result`] type, when writing code that calls many functions that return the
|
|
78
|
+
//! [`Option`] type, handling `Some`/`None` can be tedious. The question mark
|
|
79
|
+
//! operator, [`?`], hides some of the boilerplate of propagating values
|
|
80
|
+
//! up the call stack.
|
|
81
|
+
//!
|
|
82
|
+
//! It replaces this:
|
|
83
|
+
//!
|
|
84
|
+
//! ```
|
|
85
|
+
//! # #![allow(dead_code)]
|
|
86
|
+
//! fn add_last_numbers(stack: &mut Vec<i32>) -> Option<i32> {
|
|
87
|
+
//! let a = stack.pop();
|
|
88
|
+
//! let b = stack.pop();
|
|
89
|
+
//!
|
|
90
|
+
//! match (a, b) {
|
|
91
|
+
//! (Some(x), Some(y)) => Some(x + y),
|
|
92
|
+
//! _ => None,
|
|
93
|
+
//! }
|
|
94
|
+
//! }
|
|
95
|
+
//!
|
|
96
|
+
//! ```
|
|
97
|
+
//!
|
|
98
|
+
//! With this:
|
|
99
|
+
//!
|
|
100
|
+
//! ```
|
|
101
|
+
//! # #![allow(dead_code)]
|
|
102
|
+
//! fn add_last_numbers(stack: &mut Vec<i32>) -> Option<i32> {
|
|
103
|
+
//! Some(stack.pop()? + stack.pop()?)
|
|
104
|
+
//! }
|
|
105
|
+
//! ```
|
|
106
|
+
//!
|
|
107
|
+
//! *It's much nicer!*
|
|
108
|
+
//!
|
|
109
|
+
//! Ending the expression with [`?`] will result in the [`Some`]'s unwrapped value, unless the
|
|
110
|
+
//! result is [`None`], in which case [`None`] is returned early from the enclosing function.
|
|
111
|
+
//!
|
|
112
|
+
//! [`?`] can be used in functions that return [`Option`] because of the
|
|
113
|
+
//! early return of [`None`] that it provides.
|
|
114
|
+
//!
|
|
115
|
+
//! [`?`]: crate::ops::Try
|
|
116
|
+
//! [`Some`]: Some
|
|
117
|
+
//! [`None`]: None
|
|
118
|
+
//!
|
|
119
|
+
//! # Representation
|
|
120
|
+
//!
|
|
121
|
+
//! Rust guarantees to optimize the following types `T` such that [`Option<T>`]
|
|
122
|
+
//! has the same size, alignment, and [function call ABI] as `T`. It is
|
|
123
|
+
//! therefore sound, when `T` is one of these types, to transmute a value `t` of
|
|
124
|
+
//! type `T` to type `Option<T>` (producing the value `Some(t)`) and to
|
|
125
|
+
//! transmute a value `Some(t)` of type `Option<T>` to type `T` (producing the
|
|
126
|
+
//! value `t`).
|
|
127
|
+
//!
|
|
128
|
+
//! In some of these cases, Rust further guarantees the following:
|
|
129
|
+
//! - `transmute::<_, Option<T>>([0u8; size_of::<T>()])` is sound and produces
|
|
130
|
+
//! `Option::<T>::None`
|
|
131
|
+
//! - `transmute::<_, [u8; size_of::<T>()]>(Option::<T>::None)` is sound and produces
|
|
132
|
+
//! `[0u8; size_of::<T>()]`
|
|
133
|
+
//!
|
|
134
|
+
//! These cases are identified by the second column:
|
|
135
|
+
//!
|
|
136
|
+
//! | `T` | Transmuting between `[0u8; size_of::<T>()]` and `Option::<T>::None` sound? |
|
|
137
|
+
//! |---------------------------------------------------------------------|----------------------------------------------------------------------------|
|
|
138
|
+
//! | [`Box<U>`] (specifically, only `Box<U, Global>`) | when `U: Sized` |
|
|
139
|
+
//! | `&U` | when `U: Sized` |
|
|
140
|
+
//! | `&mut U` | when `U: Sized` |
|
|
141
|
+
//! | `fn`, `extern "C" fn`[^extern_fn] | always |
|
|
142
|
+
//! | [`num::NonZero*`] | always |
|
|
143
|
+
//! | [`ptr::NonNull<U>`] | when `U: Sized` |
|
|
144
|
+
//! | `#[repr(transparent)]` struct around one of the types in this list. | when it holds for the inner type |
|
|
145
|
+
//!
|
|
146
|
+
//! [^extern_fn]: this remains true for `unsafe` variants, any argument/return types, and any other ABI: `[unsafe] extern "abi" fn` (_e.g._, `extern "system" fn`)
|
|
147
|
+
//!
|
|
148
|
+
//! Under some conditions the above types `T` are also null pointer optimized when wrapped in a [`Result`][result_repr].
|
|
149
|
+
//!
|
|
150
|
+
//! [`Box<U>`]: ../../std/boxed/struct.Box.html
|
|
151
|
+
//! [`num::NonZero*`]: crate::num
|
|
152
|
+
//! [`ptr::NonNull<U>`]: crate::ptr::NonNull
|
|
153
|
+
//! [function call ABI]: ../primitive.fn.html#abi-compatibility
|
|
154
|
+
//! [result_repr]: crate::result#representation
|
|
155
|
+
//!
|
|
156
|
+
//! This is called the "null pointer optimization" or NPO.
|
|
157
|
+
//!
|
|
158
|
+
//! It is further guaranteed that, for the cases above, one can
|
|
159
|
+
//! [`mem::transmute`] from all valid values of `T` to `Option<T>` and
|
|
160
|
+
//! from `Some::<T>(_)` to `T` (but transmuting `None::<T>` to `T`
|
|
161
|
+
//! is undefined behavior).
|
|
162
|
+
//!
|
|
163
|
+
//! # Method overview
|
|
164
|
+
//!
|
|
165
|
+
//! In addition to working with pattern matching, [`Option`] provides a wide
|
|
166
|
+
//! variety of different methods.
|
|
167
|
+
//!
|
|
168
|
+
//! ## Querying the variant
|
|
169
|
+
//!
|
|
170
|
+
//! The [`is_some`] and [`is_none`] methods return [`true`] if the [`Option`]
|
|
171
|
+
//! is [`Some`] or [`None`], respectively.
|
|
172
|
+
//!
|
|
173
|
+
//! The [`is_some_and`] and [`is_none_or`] methods apply the provided function
|
|
174
|
+
//! to the contents of the [`Option`] to produce a boolean value.
|
|
175
|
+
//! If this is [`None`] then a default result is returned instead without executing the function.
|
|
176
|
+
//!
|
|
177
|
+
//! [`is_none`]: Option::is_none
|
|
178
|
+
//! [`is_some`]: Option::is_some
|
|
179
|
+
//! [`is_some_and`]: Option::is_some_and
|
|
180
|
+
//! [`is_none_or`]: Option::is_none_or
|
|
181
|
+
//!
|
|
182
|
+
//! ## Adapters for working with references
|
|
183
|
+
//!
|
|
184
|
+
//! * [`as_ref`] converts from <code>[&][][Option]\<T></code> to <code>[Option]<[&]T></code>
|
|
185
|
+
//! * [`as_mut`] converts from <code>[&mut] [Option]\<T></code> to <code>[Option]<[&mut] T></code>
|
|
186
|
+
//! * [`as_deref`] converts from <code>[&][][Option]\<T></code> to
|
|
187
|
+
//! <code>[Option]<[&]T::[Target]></code>
|
|
188
|
+
//! * [`as_deref_mut`] converts from <code>[&mut] [Option]\<T></code> to
|
|
189
|
+
//! <code>[Option]<[&mut] T::[Target]></code>
|
|
190
|
+
//! * [`as_pin_ref`] converts from <code>[Pin]<[&][][Option]\<T>></code> to
|
|
191
|
+
//! <code>[Option]<[Pin]<[&]T>></code>
|
|
192
|
+
//! * [`as_pin_mut`] converts from <code>[Pin]<[&mut] [Option]\<T>></code> to
|
|
193
|
+
//! <code>[Option]<[Pin]<[&mut] T>></code>
|
|
194
|
+
//! * [`as_slice`] returns a one-element slice of the contained value, if any.
|
|
195
|
+
//! If this is [`None`], an empty slice is returned.
|
|
196
|
+
//! * [`as_mut_slice`] returns a mutable one-element slice of the contained value, if any.
|
|
197
|
+
//! If this is [`None`], an empty slice is returned.
|
|
198
|
+
//!
|
|
199
|
+
//! [&]: reference "shared reference"
|
|
200
|
+
//! [&mut]: reference "mutable reference"
|
|
201
|
+
//! [Target]: Deref::Target "ops::Deref::Target"
|
|
202
|
+
//! [`as_deref`]: Option::as_deref
|
|
203
|
+
//! [`as_deref_mut`]: Option::as_deref_mut
|
|
204
|
+
//! [`as_mut`]: Option::as_mut
|
|
205
|
+
//! [`as_pin_mut`]: Option::as_pin_mut
|
|
206
|
+
//! [`as_pin_ref`]: Option::as_pin_ref
|
|
207
|
+
//! [`as_ref`]: Option::as_ref
|
|
208
|
+
//! [`as_slice`]: Option::as_slice
|
|
209
|
+
//! [`as_mut_slice`]: Option::as_mut_slice
|
|
210
|
+
//!
|
|
211
|
+
//! ## Extracting the contained value
|
|
212
|
+
//!
|
|
213
|
+
//! These methods extract the contained value in an [`Option<T>`] when it
|
|
214
|
+
//! is the [`Some`] variant. If the [`Option`] is [`None`]:
|
|
215
|
+
//!
|
|
216
|
+
//! * [`expect`] panics with a provided custom message
|
|
217
|
+
//! * [`unwrap`] panics with a generic message
|
|
218
|
+
//! * [`unwrap_or`] returns the provided default value
|
|
219
|
+
//! * [`unwrap_or_default`] returns the default value of the type `T`
|
|
220
|
+
//! (which must implement the [`Default`] trait)
|
|
221
|
+
//! * [`unwrap_or_else`] returns the result of evaluating the provided
|
|
222
|
+
//! function
|
|
223
|
+
//! * [`unwrap_unchecked`] produces *[undefined behavior]*
|
|
224
|
+
//!
|
|
225
|
+
//! [`expect`]: Option::expect
|
|
226
|
+
//! [`unwrap`]: Option::unwrap
|
|
227
|
+
//! [`unwrap_or`]: Option::unwrap_or
|
|
228
|
+
//! [`unwrap_or_default`]: Option::unwrap_or_default
|
|
229
|
+
//! [`unwrap_or_else`]: Option::unwrap_or_else
|
|
230
|
+
//! [`unwrap_unchecked`]: Option::unwrap_unchecked
|
|
231
|
+
//! [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html
|
|
232
|
+
//!
|
|
233
|
+
//! ## Transforming contained values
|
|
234
|
+
//!
|
|
235
|
+
//! These methods transform [`Option`] to [`Result`]:
|
|
236
|
+
//!
|
|
237
|
+
//! * [`ok_or`] transforms [`Some(v)`] to [`Ok(v)`], and [`None`] to
|
|
238
|
+
//! [`Err(err)`] using the provided default `err` value
|
|
239
|
+
//! * [`ok_or_else`] transforms [`Some(v)`] to [`Ok(v)`], and [`None`] to
|
|
240
|
+
//! a value of [`Err`] using the provided function
|
|
241
|
+
//! * [`transpose`] transposes an [`Option`] of a [`Result`] into a
|
|
242
|
+
//! [`Result`] of an [`Option`]
|
|
243
|
+
//!
|
|
244
|
+
//! [`Err(err)`]: Err
|
|
245
|
+
//! [`Ok(v)`]: Ok
|
|
246
|
+
//! [`Some(v)`]: Some
|
|
247
|
+
//! [`ok_or`]: Option::ok_or
|
|
248
|
+
//! [`ok_or_else`]: Option::ok_or_else
|
|
249
|
+
//! [`transpose`]: Option::transpose
|
|
250
|
+
//!
|
|
251
|
+
//! These methods transform the [`Some`] variant:
|
|
252
|
+
//!
|
|
253
|
+
//! * [`filter`] calls the provided predicate function on the contained
|
|
254
|
+
//! value `t` if the [`Option`] is [`Some(t)`], and returns [`Some(t)`]
|
|
255
|
+
//! if the function returns `true`; otherwise, returns [`None`]
|
|
256
|
+
//! * [`flatten`] removes one level of nesting from an [`Option<Option<T>>`]
|
|
257
|
+
//! * [`inspect`] method takes ownership of the [`Option`] and applies
|
|
258
|
+
//! the provided function to the contained value by reference if [`Some`]
|
|
259
|
+
//! * [`map`] transforms [`Option<T>`] to [`Option<U>`] by applying the
|
|
260
|
+
//! provided function to the contained value of [`Some`] and leaving
|
|
261
|
+
//! [`None`] values unchanged
|
|
262
|
+
//!
|
|
263
|
+
//! [`Some(t)`]: Some
|
|
264
|
+
//! [`filter`]: Option::filter
|
|
265
|
+
//! [`flatten`]: Option::flatten
|
|
266
|
+
//! [`inspect`]: Option::inspect
|
|
267
|
+
//! [`map`]: Option::map
|
|
268
|
+
//!
|
|
269
|
+
//! These methods transform [`Option<T>`] to a value of a possibly
|
|
270
|
+
//! different type `U`:
|
|
271
|
+
//!
|
|
272
|
+
//! * [`map_or`] applies the provided function to the contained value of
|
|
273
|
+
//! [`Some`], or returns the provided default value if the [`Option`] is
|
|
274
|
+
//! [`None`]
|
|
275
|
+
//! * [`map_or_else`] applies the provided function to the contained value
|
|
276
|
+
//! of [`Some`], or returns the result of evaluating the provided
|
|
277
|
+
//! fallback function if the [`Option`] is [`None`]
|
|
278
|
+
//!
|
|
279
|
+
//! [`map_or`]: Option::map_or
|
|
280
|
+
//! [`map_or_else`]: Option::map_or_else
|
|
281
|
+
//!
|
|
282
|
+
//! These methods combine the [`Some`] variants of two [`Option`] values:
|
|
283
|
+
//!
|
|
284
|
+
//! * [`zip`] returns [`Some((s, o))`] if `self` is [`Some(s)`] and the
|
|
285
|
+
//! provided [`Option`] value is [`Some(o)`]; otherwise, returns [`None`]
|
|
286
|
+
//! * [`zip_with`] calls the provided function `f` and returns
|
|
287
|
+
//! [`Some(f(s, o))`] if `self` is [`Some(s)`] and the provided
|
|
288
|
+
//! [`Option`] value is [`Some(o)`]; otherwise, returns [`None`]
|
|
289
|
+
//!
|
|
290
|
+
//! [`Some(f(s, o))`]: Some
|
|
291
|
+
//! [`Some(o)`]: Some
|
|
292
|
+
//! [`Some(s)`]: Some
|
|
293
|
+
//! [`Some((s, o))`]: Some
|
|
294
|
+
//! [`zip`]: Option::zip
|
|
295
|
+
//! [`zip_with`]: Option::zip_with
|
|
296
|
+
//!
|
|
297
|
+
//! ## Boolean operators
|
|
298
|
+
//!
|
|
299
|
+
//! These methods treat the [`Option`] as a boolean value, where [`Some`]
|
|
300
|
+
//! acts like [`true`] and [`None`] acts like [`false`]. There are two
|
|
301
|
+
//! categories of these methods: ones that take an [`Option`] as input, and
|
|
302
|
+
//! ones that take a function as input (to be lazily evaluated).
|
|
303
|
+
//!
|
|
304
|
+
//! The [`and`], [`or`], and [`xor`] methods take another [`Option`] as
|
|
305
|
+
//! input, and produce an [`Option`] as output. Only the [`and`] method can
|
|
306
|
+
//! produce an [`Option<U>`] value having a different inner type `U` than
|
|
307
|
+
//! [`Option<T>`].
|
|
308
|
+
//!
|
|
309
|
+
//! | method | self | input | output |
|
|
310
|
+
//! |---------|-----------|-----------|-----------|
|
|
311
|
+
//! | [`and`] | `None` | (ignored) | `None` |
|
|
312
|
+
//! | [`and`] | `Some(x)` | `None` | `None` |
|
|
313
|
+
//! | [`and`] | `Some(x)` | `Some(y)` | `Some(y)` |
|
|
314
|
+
//! | [`or`] | `None` | `None` | `None` |
|
|
315
|
+
//! | [`or`] | `None` | `Some(y)` | `Some(y)` |
|
|
316
|
+
//! | [`or`] | `Some(x)` | (ignored) | `Some(x)` |
|
|
317
|
+
//! | [`xor`] | `None` | `None` | `None` |
|
|
318
|
+
//! | [`xor`] | `None` | `Some(y)` | `Some(y)` |
|
|
319
|
+
//! | [`xor`] | `Some(x)` | `None` | `Some(x)` |
|
|
320
|
+
//! | [`xor`] | `Some(x)` | `Some(y)` | `None` |
|
|
321
|
+
//!
|
|
322
|
+
//! [`and`]: Option::and
|
|
323
|
+
//! [`or`]: Option::or
|
|
324
|
+
//! [`xor`]: Option::xor
|
|
325
|
+
//!
|
|
326
|
+
//! The [`and_then`] and [`or_else`] methods take a function as input, and
|
|
327
|
+
//! only evaluate the function when they need to produce a new value. Only
|
|
328
|
+
//! the [`and_then`] method can produce an [`Option<U>`] value having a
|
|
329
|
+
//! different inner type `U` than [`Option<T>`].
|
|
330
|
+
//!
|
|
331
|
+
//! | method | self | function input | function result | output |
|
|
332
|
+
//! |--------------|-----------|----------------|-----------------|-----------|
|
|
333
|
+
//! | [`and_then`] | `None` | (not provided) | (not evaluated) | `None` |
|
|
334
|
+
//! | [`and_then`] | `Some(x)` | `x` | `None` | `None` |
|
|
335
|
+
//! | [`and_then`] | `Some(x)` | `x` | `Some(y)` | `Some(y)` |
|
|
336
|
+
//! | [`or_else`] | `None` | (not provided) | `None` | `None` |
|
|
337
|
+
//! | [`or_else`] | `None` | (not provided) | `Some(y)` | `Some(y)` |
|
|
338
|
+
//! | [`or_else`] | `Some(x)` | (not provided) | (not evaluated) | `Some(x)` |
|
|
339
|
+
//!
|
|
340
|
+
//! [`and_then`]: Option::and_then
|
|
341
|
+
//! [`or_else`]: Option::or_else
|
|
342
|
+
//!
|
|
343
|
+
//! This is an example of using methods like [`and_then`] and [`or`] in a
|
|
344
|
+
//! pipeline of method calls. Early stages of the pipeline pass failure
|
|
345
|
+
//! values ([`None`]) through unchanged, and continue processing on
|
|
346
|
+
//! success values ([`Some`]). Toward the end, [`or`] substitutes an error
|
|
347
|
+
//! message if it receives [`None`].
|
|
348
|
+
//!
|
|
349
|
+
//! ```
|
|
350
|
+
//! # use std::collections::BTreeMap;
|
|
351
|
+
//! let mut bt = BTreeMap::new();
|
|
352
|
+
//! bt.insert(20u8, "foo");
|
|
353
|
+
//! bt.insert(42u8, "bar");
|
|
354
|
+
//! let res = [0u8, 1, 11, 200, 22]
|
|
355
|
+
//! .into_iter()
|
|
356
|
+
//! .map(|x| {
|
|
357
|
+
//! // `checked_sub()` returns `None` on error
|
|
358
|
+
//! x.checked_sub(1)
|
|
359
|
+
//! // same with `checked_mul()`
|
|
360
|
+
//! .and_then(|x| x.checked_mul(2))
|
|
361
|
+
//! // `BTreeMap::get` returns `None` on error
|
|
362
|
+
//! .and_then(|x| bt.get(&x))
|
|
363
|
+
//! // Substitute an error message if we have `None` so far
|
|
364
|
+
//! .or(Some(&"error!"))
|
|
365
|
+
//! .copied()
|
|
366
|
+
//! // Won't panic because we unconditionally used `Some` above
|
|
367
|
+
//! .unwrap()
|
|
368
|
+
//! })
|
|
369
|
+
//! .collect::<Vec<_>>();
|
|
370
|
+
//! assert_eq!(res, ["error!", "error!", "foo", "error!", "bar"]);
|
|
371
|
+
//! ```
|
|
372
|
+
//!
|
|
373
|
+
//! ## Comparison operators
|
|
374
|
+
//!
|
|
375
|
+
//! If `T` implements [`PartialOrd`] then [`Option<T>`] will derive its
|
|
376
|
+
//! [`PartialOrd`] implementation. With this order, [`None`] compares as
|
|
377
|
+
//! less than any [`Some`], and two [`Some`] compare the same way as their
|
|
378
|
+
//! contained values would in `T`. If `T` also implements
|
|
379
|
+
//! [`Ord`], then so does [`Option<T>`].
|
|
380
|
+
//!
|
|
381
|
+
//! ```
|
|
382
|
+
//! assert!(None < Some(0));
|
|
383
|
+
//! assert!(Some(0) < Some(1));
|
|
384
|
+
//! ```
|
|
385
|
+
//!
|
|
386
|
+
//! ## Iterating over `Option`
|
|
387
|
+
//!
|
|
388
|
+
//! An [`Option`] can be iterated over. This can be helpful if you need an
|
|
389
|
+
//! iterator that is conditionally empty. The iterator will either produce
|
|
390
|
+
//! a single value (when the [`Option`] is [`Some`]), or produce no values
|
|
391
|
+
//! (when the [`Option`] is [`None`]). For example, [`into_iter`] acts like
|
|
392
|
+
//! [`once(v)`] if the [`Option`] is [`Some(v)`], and like [`empty()`] if
|
|
393
|
+
//! the [`Option`] is [`None`].
|
|
394
|
+
//!
|
|
395
|
+
//! [`Some(v)`]: Some
|
|
396
|
+
//! [`empty()`]: crate::iter::empty
|
|
397
|
+
//! [`once(v)`]: crate::iter::once
|
|
398
|
+
//!
|
|
399
|
+
//! Iterators over [`Option<T>`] come in three types:
|
|
400
|
+
//!
|
|
401
|
+
//! * [`into_iter`] consumes the [`Option`] and produces the contained
|
|
402
|
+
//! value
|
|
403
|
+
//! * [`iter`] produces an immutable reference of type `&T` to the
|
|
404
|
+
//! contained value
|
|
405
|
+
//! * [`iter_mut`] produces a mutable reference of type `&mut T` to the
|
|
406
|
+
//! contained value
|
|
407
|
+
//!
|
|
408
|
+
//! [`into_iter`]: Option::into_iter
|
|
409
|
+
//! [`iter`]: Option::iter
|
|
410
|
+
//! [`iter_mut`]: Option::iter_mut
|
|
411
|
+
//!
|
|
412
|
+
//! An iterator over [`Option`] can be useful when chaining iterators, for
|
|
413
|
+
//! example, to conditionally insert items. (It's not always necessary to
|
|
414
|
+
//! explicitly call an iterator constructor: many [`Iterator`] methods that
|
|
415
|
+
//! accept other iterators will also accept iterable types that implement
|
|
416
|
+
//! [`IntoIterator`], which includes [`Option`].)
|
|
417
|
+
//!
|
|
418
|
+
//! ```
|
|
419
|
+
//! let yep = Some(42);
|
|
420
|
+
//! let nope = None;
|
|
421
|
+
//! // chain() already calls into_iter(), so we don't have to do so
|
|
422
|
+
//! let nums: Vec<i32> = (0..4).chain(yep).chain(4..8).collect();
|
|
423
|
+
//! assert_eq!(nums, [0, 1, 2, 3, 42, 4, 5, 6, 7]);
|
|
424
|
+
//! let nums: Vec<i32> = (0..4).chain(nope).chain(4..8).collect();
|
|
425
|
+
//! assert_eq!(nums, [0, 1, 2, 3, 4, 5, 6, 7]);
|
|
426
|
+
//! ```
|
|
427
|
+
//!
|
|
428
|
+
//! One reason to chain iterators in this way is that a function returning
|
|
429
|
+
//! `impl Iterator` must have all possible return values be of the same
|
|
430
|
+
//! concrete type. Chaining an iterated [`Option`] can help with that.
|
|
431
|
+
//!
|
|
432
|
+
//! ```
|
|
433
|
+
//! fn make_iter(do_insert: bool) -> impl Iterator<Item = i32> {
|
|
434
|
+
//! // Explicit returns to illustrate return types matching
|
|
435
|
+
//! match do_insert {
|
|
436
|
+
//! true => return (0..4).chain(Some(42)).chain(4..8),
|
|
437
|
+
//! false => return (0..4).chain(None).chain(4..8),
|
|
438
|
+
//! }
|
|
439
|
+
//! }
|
|
440
|
+
//! println!("{:?}", make_iter(true).collect::<Vec<_>>());
|
|
441
|
+
//! println!("{:?}", make_iter(false).collect::<Vec<_>>());
|
|
442
|
+
//! ```
|
|
443
|
+
//!
|
|
444
|
+
//! If we try to do the same thing, but using [`once()`] and [`empty()`],
|
|
445
|
+
//! we can't return `impl Iterator` anymore because the concrete types of
|
|
446
|
+
//! the return values differ.
|
|
447
|
+
//!
|
|
448
|
+
//! [`empty()`]: crate::iter::empty
|
|
449
|
+
//! [`once()`]: crate::iter::once
|
|
450
|
+
//!
|
|
451
|
+
//! ```compile_fail,E0308
|
|
452
|
+
//! # use std::iter::{empty, once};
|
|
453
|
+
//! // This won't compile because all possible returns from the function
|
|
454
|
+
//! // must have the same concrete type.
|
|
455
|
+
//! fn make_iter(do_insert: bool) -> impl Iterator<Item = i32> {
|
|
456
|
+
//! // Explicit returns to illustrate return types not matching
|
|
457
|
+
//! match do_insert {
|
|
458
|
+
//! true => return (0..4).chain(once(42)).chain(4..8),
|
|
459
|
+
//! false => return (0..4).chain(empty()).chain(4..8),
|
|
460
|
+
//! }
|
|
461
|
+
//! }
|
|
462
|
+
//! ```
|
|
463
|
+
//!
|
|
464
|
+
//! ## Collecting into `Option`
|
|
465
|
+
//!
|
|
466
|
+
//! [`Option`] implements the [`FromIterator`][impl-FromIterator] trait,
|
|
467
|
+
//! which allows an iterator over [`Option`] values to be collected into an
|
|
468
|
+
//! [`Option`] of a collection of each contained value of the original
|
|
469
|
+
//! [`Option`] values, or [`None`] if any of the elements was [`None`].
|
|
470
|
+
//!
|
|
471
|
+
//! [impl-FromIterator]: Option#impl-FromIterator%3COption%3CA%3E%3E-for-Option%3CV%3E
|
|
472
|
+
//!
|
|
473
|
+
//! ```
|
|
474
|
+
//! let v = [Some(2), Some(4), None, Some(8)];
|
|
475
|
+
//! let res: Option<Vec<_>> = v.into_iter().collect();
|
|
476
|
+
//! assert_eq!(res, None);
|
|
477
|
+
//! let v = [Some(2), Some(4), Some(8)];
|
|
478
|
+
//! let res: Option<Vec<_>> = v.into_iter().collect();
|
|
479
|
+
//! assert_eq!(res, Some(vec![2, 4, 8]));
|
|
480
|
+
//! ```
|
|
481
|
+
//!
|
|
482
|
+
//! [`Option`] also implements the [`Product`][impl-Product] and
|
|
483
|
+
//! [`Sum`][impl-Sum] traits, allowing an iterator over [`Option`] values
|
|
484
|
+
//! to provide the [`product`][Iterator::product] and
|
|
485
|
+
//! [`sum`][Iterator::sum] methods.
|
|
486
|
+
//!
|
|
487
|
+
//! [impl-Product]: Option#impl-Product%3COption%3CU%3E%3E-for-Option%3CT%3E
|
|
488
|
+
//! [impl-Sum]: Option#impl-Sum%3COption%3CU%3E%3E-for-Option%3CT%3E
|
|
489
|
+
//!
|
|
490
|
+
//! ```
|
|
491
|
+
//! let v = [None, Some(1), Some(2), Some(3)];
|
|
492
|
+
//! let res: Option<i32> = v.into_iter().sum();
|
|
493
|
+
//! assert_eq!(res, None);
|
|
494
|
+
//! let v = [Some(1), Some(2), Some(21)];
|
|
495
|
+
//! let res: Option<i32> = v.into_iter().product();
|
|
496
|
+
//! assert_eq!(res, Some(42));
|
|
497
|
+
//! ```
|
|
498
|
+
//!
|
|
499
|
+
//! ## Modifying an [`Option`] in-place
|
|
500
|
+
//!
|
|
501
|
+
//! These methods return a mutable reference to the contained value of an
|
|
502
|
+
//! [`Option<T>`]:
|
|
503
|
+
//!
|
|
504
|
+
//! * [`insert`] inserts a value, dropping any old contents
|
|
505
|
+
//! * [`get_or_insert`] gets the current value, inserting a provided
|
|
506
|
+
//! default value if it is [`None`]
|
|
507
|
+
//! * [`get_or_insert_default`] gets the current value, inserting the
|
|
508
|
+
//! default value of type `T` (which must implement [`Default`]) if it is
|
|
509
|
+
//! [`None`]
|
|
510
|
+
//! * [`get_or_insert_with`] gets the current value, inserting a default
|
|
511
|
+
//! computed by the provided function if it is [`None`]
|
|
512
|
+
//!
|
|
513
|
+
//! [`get_or_insert`]: Option::get_or_insert
|
|
514
|
+
//! [`get_or_insert_default`]: Option::get_or_insert_default
|
|
515
|
+
//! [`get_or_insert_with`]: Option::get_or_insert_with
|
|
516
|
+
//! [`insert`]: Option::insert
|
|
517
|
+
//!
|
|
518
|
+
//! These methods transfer ownership of the contained value of an
|
|
519
|
+
//! [`Option`]:
|
|
520
|
+
//!
|
|
521
|
+
//! * [`take`] takes ownership of the contained value of an [`Option`], if
|
|
522
|
+
//! any, replacing the [`Option`] with [`None`]
|
|
523
|
+
//! * [`replace`] takes ownership of the contained value of an [`Option`],
|
|
524
|
+
//! if any, replacing the [`Option`] with a [`Some`] containing the
|
|
525
|
+
//! provided value
|
|
526
|
+
//!
|
|
527
|
+
//! [`replace`]: Option::replace
|
|
528
|
+
//! [`take`]: Option::take
|
|
529
|
+
//!
|
|
530
|
+
//! # Examples
|
|
531
|
+
//!
|
|
532
|
+
//! Basic pattern matching on [`Option`]:
|
|
533
|
+
//!
|
|
534
|
+
//! ```
|
|
535
|
+
//! let msg = Some("howdy");
|
|
536
|
+
//!
|
|
537
|
+
//! // Take a reference to the contained string
|
|
538
|
+
//! if let Some(m) = &msg {
|
|
539
|
+
//! println!("{}", *m);
|
|
540
|
+
//! }
|
|
541
|
+
//!
|
|
542
|
+
//! // Remove the contained string, destroying the Option
|
|
543
|
+
//! let unwrapped_msg = msg.unwrap_or("default message");
|
|
544
|
+
//! ```
|
|
545
|
+
//!
|
|
546
|
+
//! Initialize a result to [`None`] before a loop:
|
|
547
|
+
//!
|
|
548
|
+
//! ```
|
|
549
|
+
//! enum Kingdom { Plant(u32, &'static str), Animal(u32, &'static str) }
|
|
550
|
+
//!
|
|
551
|
+
//! // A list of data to search through.
|
|
552
|
+
//! let all_the_big_things = [
|
|
553
|
+
//! Kingdom::Plant(250, "redwood"),
|
|
554
|
+
//! Kingdom::Plant(230, "noble fir"),
|
|
555
|
+
//! Kingdom::Plant(229, "sugar pine"),
|
|
556
|
+
//! Kingdom::Animal(25, "blue whale"),
|
|
557
|
+
//! Kingdom::Animal(19, "fin whale"),
|
|
558
|
+
//! Kingdom::Animal(15, "north pacific right whale"),
|
|
559
|
+
//! ];
|
|
560
|
+
//!
|
|
561
|
+
//! // We're going to search for the name of the biggest animal,
|
|
562
|
+
//! // but to start with we've just got `None`.
|
|
563
|
+
//! let mut name_of_biggest_animal = None;
|
|
564
|
+
//! let mut size_of_biggest_animal = 0;
|
|
565
|
+
//! for big_thing in &all_the_big_things {
|
|
566
|
+
//! match *big_thing {
|
|
567
|
+
//! Kingdom::Animal(size, name) if size > size_of_biggest_animal => {
|
|
568
|
+
//! // Now we've found the name of some big animal
|
|
569
|
+
//! size_of_biggest_animal = size;
|
|
570
|
+
//! name_of_biggest_animal = Some(name);
|
|
571
|
+
//! }
|
|
572
|
+
//! Kingdom::Animal(..) | Kingdom::Plant(..) => ()
|
|
573
|
+
//! }
|
|
574
|
+
//! }
|
|
575
|
+
//!
|
|
576
|
+
//! match name_of_biggest_animal {
|
|
577
|
+
//! Some(name) => println!("the biggest animal is {name}"),
|
|
578
|
+
//! None => println!("there are no animals :("),
|
|
579
|
+
//! }
|
|
580
|
+
//! ```
|
|
581
|
+
|
|
582
|
+
#![stable(feature = "rust1", since = "1.0.0")]
|
|
583
|
+
|
|
584
|
+
use crate::clone::TrivialClone;
|
|
585
|
+
use crate::iter::{self, FusedIterator, TrustedLen};
|
|
586
|
+
use crate::marker::Destruct;
|
|
587
|
+
use crate::ops::{self, ControlFlow, Deref, DerefMut};
|
|
588
|
+
use crate::panicking::{panic, panic_display};
|
|
589
|
+
use crate::pin::Pin;
|
|
590
|
+
use crate::{cmp, convert, hint, mem, slice};
|
|
591
|
+
|
|
592
|
+
/// The `Option` type. See [the module level documentation](self) for more.
|
|
593
|
+
#[doc(search_unbox)]
|
|
594
|
+
#[derive(Copy, Debug, Hash)]
|
|
595
|
+
#[derive_const(Eq)]
|
|
596
|
+
#[rustc_diagnostic_item = "Option"]
|
|
597
|
+
#[lang = "Option"]
|
|
598
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
599
|
+
#[allow(clippy::derived_hash_with_manual_eq)] // PartialEq is manually implemented equivalently
|
|
600
|
+
pub enum Option<T> {
|
|
601
|
+
/// No value.
|
|
602
|
+
#[lang = "None"]
|
|
603
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
604
|
+
None,
|
|
605
|
+
/// Some value of type `T`.
|
|
606
|
+
#[lang = "Some"]
|
|
607
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
608
|
+
Some(#[stable(feature = "rust1", since = "1.0.0")] T),
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
612
|
+
// Type implementation
|
|
613
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
614
|
+
|
|
615
|
+
impl<T> Option<T> {
|
|
616
|
+
/////////////////////////////////////////////////////////////////////////
|
|
617
|
+
// Querying the contained values
|
|
618
|
+
/////////////////////////////////////////////////////////////////////////
|
|
619
|
+
|
|
620
|
+
/// Returns `true` if the option is a [`Some`] value.
|
|
621
|
+
///
|
|
622
|
+
/// # Examples
|
|
623
|
+
///
|
|
624
|
+
/// ```
|
|
625
|
+
/// let x: Option<u32> = Some(2);
|
|
626
|
+
/// assert_eq!(x.is_some(), true);
|
|
627
|
+
///
|
|
628
|
+
/// let x: Option<u32> = None;
|
|
629
|
+
/// assert_eq!(x.is_some(), false);
|
|
630
|
+
/// ```
|
|
631
|
+
#[must_use = "if you intended to assert that this has a value, consider `.unwrap()` instead"]
|
|
632
|
+
#[inline]
|
|
633
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
634
|
+
#[rustc_const_stable(feature = "const_option_basics", since = "1.48.0")]
|
|
635
|
+
pub const fn is_some(&self) -> bool {
|
|
636
|
+
matches!(*self, Some(_))
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
/// Returns `true` if the option is a [`Some`] and the value inside of it matches a predicate.
|
|
640
|
+
///
|
|
641
|
+
/// # Examples
|
|
642
|
+
///
|
|
643
|
+
/// ```
|
|
644
|
+
/// let x: Option<u32> = Some(2);
|
|
645
|
+
/// assert_eq!(x.is_some_and(|x| x > 1), true);
|
|
646
|
+
///
|
|
647
|
+
/// let x: Option<u32> = Some(0);
|
|
648
|
+
/// assert_eq!(x.is_some_and(|x| x > 1), false);
|
|
649
|
+
///
|
|
650
|
+
/// let x: Option<u32> = None;
|
|
651
|
+
/// assert_eq!(x.is_some_and(|x| x > 1), false);
|
|
652
|
+
///
|
|
653
|
+
/// let x: Option<String> = Some("ownership".to_string());
|
|
654
|
+
/// assert_eq!(x.as_ref().is_some_and(|x| x.len() > 1), true);
|
|
655
|
+
/// println!("still alive {:?}", x);
|
|
656
|
+
/// ```
|
|
657
|
+
#[must_use]
|
|
658
|
+
#[inline]
|
|
659
|
+
#[stable(feature = "is_some_and", since = "1.70.0")]
|
|
660
|
+
#[rustc_const_unstable(feature = "const_option_ops", issue = "143956")]
|
|
661
|
+
pub const fn is_some_and(self, f: impl [const] FnOnce(T) -> bool + [const] Destruct) -> bool {
|
|
662
|
+
match self {
|
|
663
|
+
None => false,
|
|
664
|
+
Some(x) => f(x),
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
/// Returns `true` if the option is a [`None`] value.
|
|
669
|
+
///
|
|
670
|
+
/// # Examples
|
|
671
|
+
///
|
|
672
|
+
/// ```
|
|
673
|
+
/// let x: Option<u32> = Some(2);
|
|
674
|
+
/// assert_eq!(x.is_none(), false);
|
|
675
|
+
///
|
|
676
|
+
/// let x: Option<u32> = None;
|
|
677
|
+
/// assert_eq!(x.is_none(), true);
|
|
678
|
+
/// ```
|
|
679
|
+
#[must_use = "if you intended to assert that this doesn't have a value, consider \
|
|
680
|
+
wrapping this in an `assert!()` instead"]
|
|
681
|
+
#[inline]
|
|
682
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
683
|
+
#[rustc_const_stable(feature = "const_option_basics", since = "1.48.0")]
|
|
684
|
+
pub const fn is_none(&self) -> bool {
|
|
685
|
+
!self.is_some()
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
/// Returns `true` if the option is a [`None`] or the value inside of it matches a predicate.
|
|
689
|
+
///
|
|
690
|
+
/// # Examples
|
|
691
|
+
///
|
|
692
|
+
/// ```
|
|
693
|
+
/// let x: Option<u32> = Some(2);
|
|
694
|
+
/// assert_eq!(x.is_none_or(|x| x > 1), true);
|
|
695
|
+
///
|
|
696
|
+
/// let x: Option<u32> = Some(0);
|
|
697
|
+
/// assert_eq!(x.is_none_or(|x| x > 1), false);
|
|
698
|
+
///
|
|
699
|
+
/// let x: Option<u32> = None;
|
|
700
|
+
/// assert_eq!(x.is_none_or(|x| x > 1), true);
|
|
701
|
+
///
|
|
702
|
+
/// let x: Option<String> = Some("ownership".to_string());
|
|
703
|
+
/// assert_eq!(x.as_ref().is_none_or(|x| x.len() > 1), true);
|
|
704
|
+
/// println!("still alive {:?}", x);
|
|
705
|
+
/// ```
|
|
706
|
+
#[must_use]
|
|
707
|
+
#[inline]
|
|
708
|
+
#[stable(feature = "is_none_or", since = "1.82.0")]
|
|
709
|
+
#[rustc_const_unstable(feature = "const_option_ops", issue = "143956")]
|
|
710
|
+
pub const fn is_none_or(self, f: impl [const] FnOnce(T) -> bool + [const] Destruct) -> bool {
|
|
711
|
+
match self {
|
|
712
|
+
None => true,
|
|
713
|
+
Some(x) => f(x),
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
/////////////////////////////////////////////////////////////////////////
|
|
718
|
+
// Adapter for working with references
|
|
719
|
+
/////////////////////////////////////////////////////////////////////////
|
|
720
|
+
|
|
721
|
+
/// Converts from `&Option<T>` to `Option<&T>`.
|
|
722
|
+
///
|
|
723
|
+
/// # Examples
|
|
724
|
+
///
|
|
725
|
+
/// Calculates the length of an <code>Option<[String]></code> as an <code>Option<[usize]></code>
|
|
726
|
+
/// without moving the [`String`]. The [`map`] method takes the `self` argument by value,
|
|
727
|
+
/// consuming the original, so this technique uses `as_ref` to first take an `Option` to a
|
|
728
|
+
/// reference to the value inside the original.
|
|
729
|
+
///
|
|
730
|
+
/// [`map`]: Option::map
|
|
731
|
+
/// [String]: ../../std/string/struct.String.html "String"
|
|
732
|
+
/// [`String`]: ../../std/string/struct.String.html "String"
|
|
733
|
+
///
|
|
734
|
+
/// ```
|
|
735
|
+
/// let text: Option<String> = Some("Hello, world!".to_string());
|
|
736
|
+
/// // First, cast `Option<String>` to `Option<&String>` with `as_ref`,
|
|
737
|
+
/// // then consume *that* with `map`, leaving `text` on the stack.
|
|
738
|
+
/// let text_length: Option<usize> = text.as_ref().map(|s| s.len());
|
|
739
|
+
/// println!("still can print text: {text:?}");
|
|
740
|
+
/// ```
|
|
741
|
+
#[inline]
|
|
742
|
+
#[rustc_const_stable(feature = "const_option_basics", since = "1.48.0")]
|
|
743
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
744
|
+
pub const fn as_ref(&self) -> Option<&T> {
|
|
745
|
+
match *self {
|
|
746
|
+
Some(ref x) => Some(x),
|
|
747
|
+
None => None,
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
/// Converts from `&mut Option<T>` to `Option<&mut T>`.
|
|
752
|
+
///
|
|
753
|
+
/// # Examples
|
|
754
|
+
///
|
|
755
|
+
/// ```
|
|
756
|
+
/// let mut x = Some(2);
|
|
757
|
+
/// match x.as_mut() {
|
|
758
|
+
/// Some(v) => *v = 42,
|
|
759
|
+
/// None => {},
|
|
760
|
+
/// }
|
|
761
|
+
/// assert_eq!(x, Some(42));
|
|
762
|
+
/// ```
|
|
763
|
+
#[inline]
|
|
764
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
765
|
+
#[rustc_const_stable(feature = "const_option", since = "1.83.0")]
|
|
766
|
+
pub const fn as_mut(&mut self) -> Option<&mut T> {
|
|
767
|
+
match *self {
|
|
768
|
+
Some(ref mut x) => Some(x),
|
|
769
|
+
None => None,
|
|
770
|
+
}
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
/// Converts from <code>[Pin]<[&]Option\<T>></code> to <code>Option<[Pin]<[&]T>></code>.
|
|
774
|
+
///
|
|
775
|
+
/// [&]: reference "shared reference"
|
|
776
|
+
#[inline]
|
|
777
|
+
#[must_use]
|
|
778
|
+
#[stable(feature = "pin", since = "1.33.0")]
|
|
779
|
+
#[rustc_const_stable(feature = "const_option_ext", since = "1.84.0")]
|
|
780
|
+
pub const fn as_pin_ref(self: Pin<&Self>) -> Option<Pin<&T>> {
|
|
781
|
+
// FIXME(const-hack): use `map` once that is possible
|
|
782
|
+
match Pin::get_ref(self).as_ref() {
|
|
783
|
+
// SAFETY: `x` is guaranteed to be pinned because it comes from `self`
|
|
784
|
+
// which is pinned.
|
|
785
|
+
Some(x) => unsafe { Some(Pin::new_unchecked(x)) },
|
|
786
|
+
None => None,
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
/// Converts from <code>[Pin]<[&mut] Option\<T>></code> to <code>Option<[Pin]<[&mut] T>></code>.
|
|
791
|
+
///
|
|
792
|
+
/// [&mut]: reference "mutable reference"
|
|
793
|
+
#[inline]
|
|
794
|
+
#[must_use]
|
|
795
|
+
#[stable(feature = "pin", since = "1.33.0")]
|
|
796
|
+
#[rustc_const_stable(feature = "const_option_ext", since = "1.84.0")]
|
|
797
|
+
pub const fn as_pin_mut(self: Pin<&mut Self>) -> Option<Pin<&mut T>> {
|
|
798
|
+
// SAFETY: `get_unchecked_mut` is never used to move the `Option` inside `self`.
|
|
799
|
+
// `x` is guaranteed to be pinned because it comes from `self` which is pinned.
|
|
800
|
+
unsafe {
|
|
801
|
+
// FIXME(const-hack): use `map` once that is possible
|
|
802
|
+
match Pin::get_unchecked_mut(self).as_mut() {
|
|
803
|
+
Some(x) => Some(Pin::new_unchecked(x)),
|
|
804
|
+
None => None,
|
|
805
|
+
}
|
|
806
|
+
}
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
#[inline]
|
|
810
|
+
const fn len(&self) -> usize {
|
|
811
|
+
// Using the intrinsic avoids emitting a branch to get the 0 or 1.
|
|
812
|
+
let discriminant: isize = crate::intrinsics::discriminant_value(self);
|
|
813
|
+
discriminant as usize
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
/// Returns a slice of the contained value, if any. If this is `None`, an
|
|
817
|
+
/// empty slice is returned. This can be useful to have a single type of
|
|
818
|
+
/// iterator over an `Option` or slice.
|
|
819
|
+
///
|
|
820
|
+
/// Note: Should you have an `Option<&T>` and wish to get a slice of `T`,
|
|
821
|
+
/// you can unpack it via `opt.map_or(&[], std::slice::from_ref)`.
|
|
822
|
+
///
|
|
823
|
+
/// # Examples
|
|
824
|
+
///
|
|
825
|
+
/// ```rust
|
|
826
|
+
/// assert_eq!(
|
|
827
|
+
/// [Some(1234).as_slice(), None.as_slice()],
|
|
828
|
+
/// [&[1234][..], &[][..]],
|
|
829
|
+
/// );
|
|
830
|
+
/// ```
|
|
831
|
+
///
|
|
832
|
+
/// The inverse of this function is (discounting
|
|
833
|
+
/// borrowing) [`[_]::first`](slice::first):
|
|
834
|
+
///
|
|
835
|
+
/// ```rust
|
|
836
|
+
/// for i in [Some(1234_u16), None] {
|
|
837
|
+
/// assert_eq!(i.as_ref(), i.as_slice().first());
|
|
838
|
+
/// }
|
|
839
|
+
/// ```
|
|
840
|
+
#[inline]
|
|
841
|
+
#[must_use]
|
|
842
|
+
#[stable(feature = "option_as_slice", since = "1.75.0")]
|
|
843
|
+
#[rustc_const_stable(feature = "const_option_ext", since = "1.84.0")]
|
|
844
|
+
pub const fn as_slice(&self) -> &[T] {
|
|
845
|
+
// SAFETY: When the `Option` is `Some`, we're using the actual pointer
|
|
846
|
+
// to the payload, with a length of 1, so this is equivalent to
|
|
847
|
+
// `slice::from_ref`, and thus is safe.
|
|
848
|
+
// When the `Option` is `None`, the length used is 0, so to be safe it
|
|
849
|
+
// just needs to be aligned, which it is because `&self` is aligned and
|
|
850
|
+
// the offset used is a multiple of alignment.
|
|
851
|
+
//
|
|
852
|
+
// Here we assume that `offset_of!` always returns an offset to an
|
|
853
|
+
// in-bounds and correctly aligned position for a `T` (even if in the
|
|
854
|
+
// `None` case it's just padding).
|
|
855
|
+
unsafe {
|
|
856
|
+
slice::from_raw_parts(
|
|
857
|
+
(self as *const Self).byte_add(core::mem::offset_of!(Self, Some.0)).cast(),
|
|
858
|
+
self.len(),
|
|
859
|
+
)
|
|
860
|
+
}
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
/// Returns a mutable slice of the contained value, if any. If this is
|
|
864
|
+
/// `None`, an empty slice is returned. This can be useful to have a
|
|
865
|
+
/// single type of iterator over an `Option` or slice.
|
|
866
|
+
///
|
|
867
|
+
/// Note: Should you have an `Option<&mut T>` instead of a
|
|
868
|
+
/// `&mut Option<T>`, which this method takes, you can obtain a mutable
|
|
869
|
+
/// slice via `opt.map_or(&mut [], std::slice::from_mut)`.
|
|
870
|
+
///
|
|
871
|
+
/// # Examples
|
|
872
|
+
///
|
|
873
|
+
/// ```rust
|
|
874
|
+
/// assert_eq!(
|
|
875
|
+
/// [Some(1234).as_mut_slice(), None.as_mut_slice()],
|
|
876
|
+
/// [&mut [1234][..], &mut [][..]],
|
|
877
|
+
/// );
|
|
878
|
+
/// ```
|
|
879
|
+
///
|
|
880
|
+
/// The result is a mutable slice of zero or one items that points into
|
|
881
|
+
/// our original `Option`:
|
|
882
|
+
///
|
|
883
|
+
/// ```rust
|
|
884
|
+
/// let mut x = Some(1234);
|
|
885
|
+
/// x.as_mut_slice()[0] += 1;
|
|
886
|
+
/// assert_eq!(x, Some(1235));
|
|
887
|
+
/// ```
|
|
888
|
+
///
|
|
889
|
+
/// The inverse of this method (discounting borrowing)
|
|
890
|
+
/// is [`[_]::first_mut`](slice::first_mut):
|
|
891
|
+
///
|
|
892
|
+
/// ```rust
|
|
893
|
+
/// assert_eq!(Some(123).as_mut_slice().first_mut(), Some(&mut 123))
|
|
894
|
+
/// ```
|
|
895
|
+
#[inline]
|
|
896
|
+
#[must_use]
|
|
897
|
+
#[stable(feature = "option_as_slice", since = "1.75.0")]
|
|
898
|
+
#[rustc_const_stable(feature = "const_option_ext", since = "1.84.0")]
|
|
899
|
+
pub const fn as_mut_slice(&mut self) -> &mut [T] {
|
|
900
|
+
// SAFETY: When the `Option` is `Some`, we're using the actual pointer
|
|
901
|
+
// to the payload, with a length of 1, so this is equivalent to
|
|
902
|
+
// `slice::from_mut`, and thus is safe.
|
|
903
|
+
// When the `Option` is `None`, the length used is 0, so to be safe it
|
|
904
|
+
// just needs to be aligned, which it is because `&self` is aligned and
|
|
905
|
+
// the offset used is a multiple of alignment.
|
|
906
|
+
//
|
|
907
|
+
// In the new version, the intrinsic creates a `*const T` from a
|
|
908
|
+
// mutable reference so it is safe to cast back to a mutable pointer
|
|
909
|
+
// here. As with `as_slice`, the intrinsic always returns a pointer to
|
|
910
|
+
// an in-bounds and correctly aligned position for a `T` (even if in
|
|
911
|
+
// the `None` case it's just padding).
|
|
912
|
+
unsafe {
|
|
913
|
+
slice::from_raw_parts_mut(
|
|
914
|
+
(self as *mut Self).byte_add(core::mem::offset_of!(Self, Some.0)).cast(),
|
|
915
|
+
self.len(),
|
|
916
|
+
)
|
|
917
|
+
}
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
/////////////////////////////////////////////////////////////////////////
|
|
921
|
+
// Getting to contained values
|
|
922
|
+
/////////////////////////////////////////////////////////////////////////
|
|
923
|
+
|
|
924
|
+
/// Returns the contained [`Some`] value, consuming the `self` value.
|
|
925
|
+
///
|
|
926
|
+
/// # Panics
|
|
927
|
+
///
|
|
928
|
+
/// Panics if the value is a [`None`] with a custom panic message provided by
|
|
929
|
+
/// `msg`.
|
|
930
|
+
///
|
|
931
|
+
/// # Examples
|
|
932
|
+
///
|
|
933
|
+
/// ```
|
|
934
|
+
/// let x = Some("value");
|
|
935
|
+
/// assert_eq!(x.expect("fruits are healthy"), "value");
|
|
936
|
+
/// ```
|
|
937
|
+
///
|
|
938
|
+
/// ```should_panic
|
|
939
|
+
/// let x: Option<&str> = None;
|
|
940
|
+
/// x.expect("fruits are healthy"); // panics with `fruits are healthy`
|
|
941
|
+
/// ```
|
|
942
|
+
///
|
|
943
|
+
/// # Recommended Message Style
|
|
944
|
+
///
|
|
945
|
+
/// We recommend that `expect` messages are used to describe the reason you
|
|
946
|
+
/// _expect_ the `Option` should be `Some`.
|
|
947
|
+
///
|
|
948
|
+
/// ```should_panic
|
|
949
|
+
/// # let slice: &[u8] = &[];
|
|
950
|
+
/// let item = slice.get(0)
|
|
951
|
+
/// .expect("slice should not be empty");
|
|
952
|
+
/// ```
|
|
953
|
+
///
|
|
954
|
+
/// **Hint**: If you're having trouble remembering how to phrase expect
|
|
955
|
+
/// error messages remember to focus on the word "should" as in "env
|
|
956
|
+
/// variable should be set by blah" or "the given binary should be available
|
|
957
|
+
/// and executable by the current user".
|
|
958
|
+
///
|
|
959
|
+
/// For more detail on expect message styles and the reasoning behind our
|
|
960
|
+
/// recommendation please refer to the section on ["Common Message
|
|
961
|
+
/// Styles"](../../std/error/index.html#common-message-styles) in the [`std::error`](../../std/error/index.html) module docs.
|
|
962
|
+
#[inline]
|
|
963
|
+
#[track_caller]
|
|
964
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
965
|
+
#[rustc_diagnostic_item = "option_expect"]
|
|
966
|
+
#[rustc_allow_const_fn_unstable(const_precise_live_drops)]
|
|
967
|
+
#[rustc_const_stable(feature = "const_option", since = "1.83.0")]
|
|
968
|
+
pub const fn expect(self, msg: &str) -> T {
|
|
969
|
+
match self {
|
|
970
|
+
Some(val) => val,
|
|
971
|
+
None => expect_failed(msg),
|
|
972
|
+
}
|
|
973
|
+
}
|
|
974
|
+
|
|
975
|
+
/// Returns the contained [`Some`] value, consuming the `self` value.
|
|
976
|
+
///
|
|
977
|
+
/// Because this function may panic, its use is generally discouraged.
|
|
978
|
+
/// Panics are meant for unrecoverable errors, and
|
|
979
|
+
/// [may abort the entire program][panic-abort].
|
|
980
|
+
///
|
|
981
|
+
/// Instead, prefer to use pattern matching and handle the [`None`]
|
|
982
|
+
/// case explicitly, or call [`unwrap_or`], [`unwrap_or_else`], or
|
|
983
|
+
/// [`unwrap_or_default`]. In functions returning `Option`, you can use
|
|
984
|
+
/// [the `?` (try) operator][try-option].
|
|
985
|
+
///
|
|
986
|
+
/// [panic-abort]: https://doc.rust-lang.org/book/ch09-01-unrecoverable-errors-with-panic.html
|
|
987
|
+
/// [try-option]: https://doc.rust-lang.org/book/ch09-02-recoverable-errors-with-result.html#where-the--operator-can-be-used
|
|
988
|
+
/// [`unwrap_or`]: Option::unwrap_or
|
|
989
|
+
/// [`unwrap_or_else`]: Option::unwrap_or_else
|
|
990
|
+
/// [`unwrap_or_default`]: Option::unwrap_or_default
|
|
991
|
+
///
|
|
992
|
+
/// # Panics
|
|
993
|
+
///
|
|
994
|
+
/// Panics if the self value equals [`None`].
|
|
995
|
+
///
|
|
996
|
+
/// # Examples
|
|
997
|
+
///
|
|
998
|
+
/// ```
|
|
999
|
+
/// let x = Some("air");
|
|
1000
|
+
/// assert_eq!(x.unwrap(), "air");
|
|
1001
|
+
/// ```
|
|
1002
|
+
///
|
|
1003
|
+
/// ```should_panic
|
|
1004
|
+
/// let x: Option<&str> = None;
|
|
1005
|
+
/// assert_eq!(x.unwrap(), "air"); // fails
|
|
1006
|
+
/// ```
|
|
1007
|
+
#[inline(always)]
|
|
1008
|
+
#[track_caller]
|
|
1009
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
1010
|
+
#[rustc_diagnostic_item = "option_unwrap"]
|
|
1011
|
+
#[rustc_allow_const_fn_unstable(const_precise_live_drops)]
|
|
1012
|
+
#[rustc_const_stable(feature = "const_option", since = "1.83.0")]
|
|
1013
|
+
pub const fn unwrap(self) -> T {
|
|
1014
|
+
match self {
|
|
1015
|
+
Some(val) => val,
|
|
1016
|
+
None => unwrap_failed(),
|
|
1017
|
+
}
|
|
1018
|
+
}
|
|
1019
|
+
|
|
1020
|
+
/// Returns the contained [`Some`] value or a provided default.
|
|
1021
|
+
///
|
|
1022
|
+
/// Arguments passed to `unwrap_or` are eagerly evaluated; if you are passing
|
|
1023
|
+
/// the result of a function call, it is recommended to use [`unwrap_or_else`],
|
|
1024
|
+
/// which is lazily evaluated.
|
|
1025
|
+
///
|
|
1026
|
+
/// [`unwrap_or_else`]: Option::unwrap_or_else
|
|
1027
|
+
///
|
|
1028
|
+
/// # Examples
|
|
1029
|
+
///
|
|
1030
|
+
/// ```
|
|
1031
|
+
/// assert_eq!(Some("car").unwrap_or("bike"), "car");
|
|
1032
|
+
/// assert_eq!(None.unwrap_or("bike"), "bike");
|
|
1033
|
+
/// ```
|
|
1034
|
+
#[inline]
|
|
1035
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
1036
|
+
#[rustc_allow_const_fn_unstable(const_precise_live_drops)]
|
|
1037
|
+
#[rustc_const_unstable(feature = "const_option_ops", issue = "143956")]
|
|
1038
|
+
pub const fn unwrap_or(self, default: T) -> T
|
|
1039
|
+
where
|
|
1040
|
+
T: [const] Destruct,
|
|
1041
|
+
{
|
|
1042
|
+
match self {
|
|
1043
|
+
Some(x) => x,
|
|
1044
|
+
None => default,
|
|
1045
|
+
}
|
|
1046
|
+
}
|
|
1047
|
+
|
|
1048
|
+
/// Returns the contained [`Some`] value or computes it from a closure.
|
|
1049
|
+
///
|
|
1050
|
+
/// # Examples
|
|
1051
|
+
///
|
|
1052
|
+
/// ```
|
|
1053
|
+
/// let k = 10;
|
|
1054
|
+
/// assert_eq!(Some(4).unwrap_or_else(|| 2 * k), 4);
|
|
1055
|
+
/// assert_eq!(None.unwrap_or_else(|| 2 * k), 20);
|
|
1056
|
+
/// ```
|
|
1057
|
+
#[inline]
|
|
1058
|
+
#[track_caller]
|
|
1059
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
1060
|
+
#[rustc_const_unstable(feature = "const_option_ops", issue = "143956")]
|
|
1061
|
+
pub const fn unwrap_or_else<F>(self, f: F) -> T
|
|
1062
|
+
where
|
|
1063
|
+
F: [const] FnOnce() -> T + [const] Destruct,
|
|
1064
|
+
{
|
|
1065
|
+
match self {
|
|
1066
|
+
Some(x) => x,
|
|
1067
|
+
None => f(),
|
|
1068
|
+
}
|
|
1069
|
+
}
|
|
1070
|
+
|
|
1071
|
+
/// Returns the contained [`Some`] value or a default.
|
|
1072
|
+
///
|
|
1073
|
+
/// Consumes the `self` argument then, if [`Some`], returns the contained
|
|
1074
|
+
/// value, otherwise if [`None`], returns the [default value] for that
|
|
1075
|
+
/// type.
|
|
1076
|
+
///
|
|
1077
|
+
/// # Examples
|
|
1078
|
+
///
|
|
1079
|
+
/// ```
|
|
1080
|
+
/// let x: Option<u32> = None;
|
|
1081
|
+
/// let y: Option<u32> = Some(12);
|
|
1082
|
+
///
|
|
1083
|
+
/// assert_eq!(x.unwrap_or_default(), 0);
|
|
1084
|
+
/// assert_eq!(y.unwrap_or_default(), 12);
|
|
1085
|
+
/// ```
|
|
1086
|
+
///
|
|
1087
|
+
/// [default value]: Default::default
|
|
1088
|
+
/// [`parse`]: str::parse
|
|
1089
|
+
/// [`FromStr`]: crate::str::FromStr
|
|
1090
|
+
#[inline]
|
|
1091
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
1092
|
+
#[rustc_const_unstable(feature = "const_option_ops", issue = "143956")]
|
|
1093
|
+
pub const fn unwrap_or_default(self) -> T
|
|
1094
|
+
where
|
|
1095
|
+
T: [const] Default,
|
|
1096
|
+
{
|
|
1097
|
+
match self {
|
|
1098
|
+
Some(x) => x,
|
|
1099
|
+
None => T::default(),
|
|
1100
|
+
}
|
|
1101
|
+
}
|
|
1102
|
+
|
|
1103
|
+
/// Returns the contained [`Some`] value, consuming the `self` value,
|
|
1104
|
+
/// without checking that the value is not [`None`].
|
|
1105
|
+
///
|
|
1106
|
+
/// # Safety
|
|
1107
|
+
///
|
|
1108
|
+
/// Calling this method on [`None`] is *[undefined behavior]*.
|
|
1109
|
+
///
|
|
1110
|
+
/// [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html
|
|
1111
|
+
///
|
|
1112
|
+
/// # Examples
|
|
1113
|
+
///
|
|
1114
|
+
/// ```
|
|
1115
|
+
/// let x = Some("air");
|
|
1116
|
+
/// assert_eq!(unsafe { x.unwrap_unchecked() }, "air");
|
|
1117
|
+
/// ```
|
|
1118
|
+
///
|
|
1119
|
+
/// ```no_run
|
|
1120
|
+
/// let x: Option<&str> = None;
|
|
1121
|
+
/// assert_eq!(unsafe { x.unwrap_unchecked() }, "air"); // Undefined behavior!
|
|
1122
|
+
/// ```
|
|
1123
|
+
#[inline]
|
|
1124
|
+
#[track_caller]
|
|
1125
|
+
#[stable(feature = "option_result_unwrap_unchecked", since = "1.58.0")]
|
|
1126
|
+
#[rustc_allow_const_fn_unstable(const_precise_live_drops)]
|
|
1127
|
+
#[rustc_const_stable(feature = "const_option", since = "1.83.0")]
|
|
1128
|
+
pub const unsafe fn unwrap_unchecked(self) -> T {
|
|
1129
|
+
match self {
|
|
1130
|
+
Some(val) => val,
|
|
1131
|
+
// SAFETY: the safety contract must be upheld by the caller.
|
|
1132
|
+
None => unsafe { hint::unreachable_unchecked() },
|
|
1133
|
+
}
|
|
1134
|
+
}
|
|
1135
|
+
|
|
1136
|
+
/////////////////////////////////////////////////////////////////////////
|
|
1137
|
+
// Transforming contained values
|
|
1138
|
+
/////////////////////////////////////////////////////////////////////////
|
|
1139
|
+
|
|
1140
|
+
/// Maps an `Option<T>` to `Option<U>` by applying a function to a contained value (if `Some`) or returns `None` (if `None`).
|
|
1141
|
+
///
|
|
1142
|
+
/// # Examples
|
|
1143
|
+
///
|
|
1144
|
+
/// Calculates the length of an <code>Option<[String]></code> as an
|
|
1145
|
+
/// <code>Option<[usize]></code>, consuming the original:
|
|
1146
|
+
///
|
|
1147
|
+
/// [String]: ../../std/string/struct.String.html "String"
|
|
1148
|
+
/// ```
|
|
1149
|
+
/// let maybe_some_string = Some(String::from("Hello, World!"));
|
|
1150
|
+
/// // `Option::map` takes self *by value*, consuming `maybe_some_string`
|
|
1151
|
+
/// let maybe_some_len = maybe_some_string.map(|s| s.len());
|
|
1152
|
+
/// assert_eq!(maybe_some_len, Some(13));
|
|
1153
|
+
///
|
|
1154
|
+
/// let x: Option<&str> = None;
|
|
1155
|
+
/// assert_eq!(x.map(|s| s.len()), None);
|
|
1156
|
+
/// ```
|
|
1157
|
+
#[inline]
|
|
1158
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
1159
|
+
#[rustc_const_unstable(feature = "const_option_ops", issue = "143956")]
|
|
1160
|
+
pub const fn map<U, F>(self, f: F) -> Option<U>
|
|
1161
|
+
where
|
|
1162
|
+
F: [const] FnOnce(T) -> U + [const] Destruct,
|
|
1163
|
+
{
|
|
1164
|
+
match self {
|
|
1165
|
+
Some(x) => Some(f(x)),
|
|
1166
|
+
None => None,
|
|
1167
|
+
}
|
|
1168
|
+
}
|
|
1169
|
+
|
|
1170
|
+
/// Calls a function with a reference to the contained value if [`Some`].
|
|
1171
|
+
///
|
|
1172
|
+
/// Returns the original option.
|
|
1173
|
+
///
|
|
1174
|
+
/// # Examples
|
|
1175
|
+
///
|
|
1176
|
+
/// ```
|
|
1177
|
+
/// let list = vec![1, 2, 3];
|
|
1178
|
+
///
|
|
1179
|
+
/// // prints "got: 2"
|
|
1180
|
+
/// let x = list
|
|
1181
|
+
/// .get(1)
|
|
1182
|
+
/// .inspect(|x| println!("got: {x}"))
|
|
1183
|
+
/// .expect("list should be long enough");
|
|
1184
|
+
///
|
|
1185
|
+
/// // prints nothing
|
|
1186
|
+
/// list.get(5).inspect(|x| println!("got: {x}"));
|
|
1187
|
+
/// ```
|
|
1188
|
+
#[inline]
|
|
1189
|
+
#[stable(feature = "result_option_inspect", since = "1.76.0")]
|
|
1190
|
+
#[rustc_const_unstable(feature = "const_option_ops", issue = "143956")]
|
|
1191
|
+
pub const fn inspect<F>(self, f: F) -> Self
|
|
1192
|
+
where
|
|
1193
|
+
F: [const] FnOnce(&T) + [const] Destruct,
|
|
1194
|
+
{
|
|
1195
|
+
if let Some(ref x) = self {
|
|
1196
|
+
f(x);
|
|
1197
|
+
}
|
|
1198
|
+
|
|
1199
|
+
self
|
|
1200
|
+
}
|
|
1201
|
+
|
|
1202
|
+
/// Returns the provided default result (if none),
|
|
1203
|
+
/// or applies a function to the contained value (if any).
|
|
1204
|
+
///
|
|
1205
|
+
/// Arguments passed to `map_or` are eagerly evaluated; if you are passing
|
|
1206
|
+
/// the result of a function call, it is recommended to use [`map_or_else`],
|
|
1207
|
+
/// which is lazily evaluated.
|
|
1208
|
+
///
|
|
1209
|
+
/// [`map_or_else`]: Option::map_or_else
|
|
1210
|
+
///
|
|
1211
|
+
/// # Examples
|
|
1212
|
+
///
|
|
1213
|
+
/// ```
|
|
1214
|
+
/// let x = Some("foo");
|
|
1215
|
+
/// assert_eq!(x.map_or(42, |v| v.len()), 3);
|
|
1216
|
+
///
|
|
1217
|
+
/// let x: Option<&str> = None;
|
|
1218
|
+
/// assert_eq!(x.map_or(42, |v| v.len()), 42);
|
|
1219
|
+
/// ```
|
|
1220
|
+
#[inline]
|
|
1221
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
1222
|
+
#[must_use = "if you don't need the returned value, use `if let` instead"]
|
|
1223
|
+
#[rustc_const_unstable(feature = "const_option_ops", issue = "143956")]
|
|
1224
|
+
pub const fn map_or<U, F>(self, default: U, f: F) -> U
|
|
1225
|
+
where
|
|
1226
|
+
F: [const] FnOnce(T) -> U + [const] Destruct,
|
|
1227
|
+
U: [const] Destruct,
|
|
1228
|
+
{
|
|
1229
|
+
match self {
|
|
1230
|
+
Some(t) => f(t),
|
|
1231
|
+
None => default,
|
|
1232
|
+
}
|
|
1233
|
+
}
|
|
1234
|
+
|
|
1235
|
+
/// Computes a default function result (if none), or
|
|
1236
|
+
/// applies a different function to the contained value (if any).
|
|
1237
|
+
///
|
|
1238
|
+
/// # Basic examples
|
|
1239
|
+
///
|
|
1240
|
+
/// ```
|
|
1241
|
+
/// let k = 21;
|
|
1242
|
+
///
|
|
1243
|
+
/// let x = Some("foo");
|
|
1244
|
+
/// assert_eq!(x.map_or_else(|| 2 * k, |v| v.len()), 3);
|
|
1245
|
+
///
|
|
1246
|
+
/// let x: Option<&str> = None;
|
|
1247
|
+
/// assert_eq!(x.map_or_else(|| 2 * k, |v| v.len()), 42);
|
|
1248
|
+
/// ```
|
|
1249
|
+
///
|
|
1250
|
+
/// # Handling a Result-based fallback
|
|
1251
|
+
///
|
|
1252
|
+
/// A somewhat common occurrence when dealing with optional values
|
|
1253
|
+
/// in combination with [`Result<T, E>`] is the case where one wants to invoke
|
|
1254
|
+
/// a fallible fallback if the option is not present. This example
|
|
1255
|
+
/// parses a command line argument (if present), or the contents of a file to
|
|
1256
|
+
/// an integer. However, unlike accessing the command line argument, reading
|
|
1257
|
+
/// the file is fallible, so it must be wrapped with `Ok`.
|
|
1258
|
+
///
|
|
1259
|
+
/// ```no_run
|
|
1260
|
+
/// # fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|
1261
|
+
/// let v: u64 = std::env::args()
|
|
1262
|
+
/// .nth(1)
|
|
1263
|
+
/// .map_or_else(|| std::fs::read_to_string("/etc/someconfig.conf"), Ok)?
|
|
1264
|
+
/// .parse()?;
|
|
1265
|
+
/// # Ok(())
|
|
1266
|
+
/// # }
|
|
1267
|
+
/// ```
|
|
1268
|
+
#[inline]
|
|
1269
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
1270
|
+
#[rustc_const_unstable(feature = "const_option_ops", issue = "143956")]
|
|
1271
|
+
pub const fn map_or_else<U, D, F>(self, default: D, f: F) -> U
|
|
1272
|
+
where
|
|
1273
|
+
D: [const] FnOnce() -> U + [const] Destruct,
|
|
1274
|
+
F: [const] FnOnce(T) -> U + [const] Destruct,
|
|
1275
|
+
{
|
|
1276
|
+
match self {
|
|
1277
|
+
Some(t) => f(t),
|
|
1278
|
+
None => default(),
|
|
1279
|
+
}
|
|
1280
|
+
}
|
|
1281
|
+
|
|
1282
|
+
/// Maps an `Option<T>` to a `U` by applying function `f` to the contained
|
|
1283
|
+
/// value if the option is [`Some`], otherwise if [`None`], returns the
|
|
1284
|
+
/// [default value] for the type `U`.
|
|
1285
|
+
///
|
|
1286
|
+
/// # Examples
|
|
1287
|
+
///
|
|
1288
|
+
/// ```
|
|
1289
|
+
/// #![feature(result_option_map_or_default)]
|
|
1290
|
+
///
|
|
1291
|
+
/// let x: Option<&str> = Some("hi");
|
|
1292
|
+
/// let y: Option<&str> = None;
|
|
1293
|
+
///
|
|
1294
|
+
/// assert_eq!(x.map_or_default(|x| x.len()), 2);
|
|
1295
|
+
/// assert_eq!(y.map_or_default(|y| y.len()), 0);
|
|
1296
|
+
/// ```
|
|
1297
|
+
///
|
|
1298
|
+
/// [default value]: Default::default
|
|
1299
|
+
#[inline]
|
|
1300
|
+
#[unstable(feature = "result_option_map_or_default", issue = "138099")]
|
|
1301
|
+
#[rustc_const_unstable(feature = "const_option_ops", issue = "143956")]
|
|
1302
|
+
pub const fn map_or_default<U, F>(self, f: F) -> U
|
|
1303
|
+
where
|
|
1304
|
+
U: [const] Default,
|
|
1305
|
+
F: [const] FnOnce(T) -> U + [const] Destruct,
|
|
1306
|
+
{
|
|
1307
|
+
match self {
|
|
1308
|
+
Some(t) => f(t),
|
|
1309
|
+
None => U::default(),
|
|
1310
|
+
}
|
|
1311
|
+
}
|
|
1312
|
+
|
|
1313
|
+
/// Transforms the `Option<T>` into a [`Result<T, E>`], mapping [`Some(v)`] to
|
|
1314
|
+
/// [`Ok(v)`] and [`None`] to [`Err(err)`].
|
|
1315
|
+
///
|
|
1316
|
+
/// Arguments passed to `ok_or` are eagerly evaluated; if you are passing the
|
|
1317
|
+
/// result of a function call, it is recommended to use [`ok_or_else`], which is
|
|
1318
|
+
/// lazily evaluated.
|
|
1319
|
+
///
|
|
1320
|
+
/// [`Ok(v)`]: Ok
|
|
1321
|
+
/// [`Err(err)`]: Err
|
|
1322
|
+
/// [`Some(v)`]: Some
|
|
1323
|
+
/// [`ok_or_else`]: Option::ok_or_else
|
|
1324
|
+
///
|
|
1325
|
+
/// # Examples
|
|
1326
|
+
///
|
|
1327
|
+
/// ```
|
|
1328
|
+
/// let x = Some("foo");
|
|
1329
|
+
/// assert_eq!(x.ok_or(0), Ok("foo"));
|
|
1330
|
+
///
|
|
1331
|
+
/// let x: Option<&str> = None;
|
|
1332
|
+
/// assert_eq!(x.ok_or(0), Err(0));
|
|
1333
|
+
/// ```
|
|
1334
|
+
#[inline]
|
|
1335
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
1336
|
+
#[rustc_const_unstable(feature = "const_option_ops", issue = "143956")]
|
|
1337
|
+
pub const fn ok_or<E: [const] Destruct>(self, err: E) -> Result<T, E> {
|
|
1338
|
+
match self {
|
|
1339
|
+
Some(v) => Ok(v),
|
|
1340
|
+
None => Err(err),
|
|
1341
|
+
}
|
|
1342
|
+
}
|
|
1343
|
+
|
|
1344
|
+
/// Transforms the `Option<T>` into a [`Result<T, E>`], mapping [`Some(v)`] to
|
|
1345
|
+
/// [`Ok(v)`] and [`None`] to [`Err(err())`].
|
|
1346
|
+
///
|
|
1347
|
+
/// [`Ok(v)`]: Ok
|
|
1348
|
+
/// [`Err(err())`]: Err
|
|
1349
|
+
/// [`Some(v)`]: Some
|
|
1350
|
+
///
|
|
1351
|
+
/// # Examples
|
|
1352
|
+
///
|
|
1353
|
+
/// ```
|
|
1354
|
+
/// let x = Some("foo");
|
|
1355
|
+
/// assert_eq!(x.ok_or_else(|| 0), Ok("foo"));
|
|
1356
|
+
///
|
|
1357
|
+
/// let x: Option<&str> = None;
|
|
1358
|
+
/// assert_eq!(x.ok_or_else(|| 0), Err(0));
|
|
1359
|
+
/// ```
|
|
1360
|
+
#[inline]
|
|
1361
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
1362
|
+
#[rustc_const_unstable(feature = "const_option_ops", issue = "143956")]
|
|
1363
|
+
pub const fn ok_or_else<E, F>(self, err: F) -> Result<T, E>
|
|
1364
|
+
where
|
|
1365
|
+
F: [const] FnOnce() -> E + [const] Destruct,
|
|
1366
|
+
{
|
|
1367
|
+
match self {
|
|
1368
|
+
Some(v) => Ok(v),
|
|
1369
|
+
None => Err(err()),
|
|
1370
|
+
}
|
|
1371
|
+
}
|
|
1372
|
+
|
|
1373
|
+
/// Converts from `Option<T>` (or `&Option<T>`) to `Option<&T::Target>`.
|
|
1374
|
+
///
|
|
1375
|
+
/// Leaves the original Option in-place, creating a new one with a reference
|
|
1376
|
+
/// to the original one, additionally coercing the contents via [`Deref`].
|
|
1377
|
+
///
|
|
1378
|
+
/// # Examples
|
|
1379
|
+
///
|
|
1380
|
+
/// ```
|
|
1381
|
+
/// let x: Option<String> = Some("hey".to_owned());
|
|
1382
|
+
/// assert_eq!(x.as_deref(), Some("hey"));
|
|
1383
|
+
///
|
|
1384
|
+
/// let x: Option<String> = None;
|
|
1385
|
+
/// assert_eq!(x.as_deref(), None);
|
|
1386
|
+
/// ```
|
|
1387
|
+
#[inline]
|
|
1388
|
+
#[stable(feature = "option_deref", since = "1.40.0")]
|
|
1389
|
+
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
|
|
1390
|
+
pub const fn as_deref(&self) -> Option<&T::Target>
|
|
1391
|
+
where
|
|
1392
|
+
T: [const] Deref,
|
|
1393
|
+
{
|
|
1394
|
+
self.as_ref().map(Deref::deref)
|
|
1395
|
+
}
|
|
1396
|
+
|
|
1397
|
+
/// Converts from `Option<T>` (or `&mut Option<T>`) to `Option<&mut T::Target>`.
|
|
1398
|
+
///
|
|
1399
|
+
/// Leaves the original `Option` in-place, creating a new one containing a mutable reference to
|
|
1400
|
+
/// the inner type's [`Deref::Target`] type.
|
|
1401
|
+
///
|
|
1402
|
+
/// # Examples
|
|
1403
|
+
///
|
|
1404
|
+
/// ```
|
|
1405
|
+
/// let mut x: Option<String> = Some("hey".to_owned());
|
|
1406
|
+
/// assert_eq!(x.as_deref_mut().map(|x| {
|
|
1407
|
+
/// x.make_ascii_uppercase();
|
|
1408
|
+
/// x
|
|
1409
|
+
/// }), Some("HEY".to_owned().as_mut_str()));
|
|
1410
|
+
/// ```
|
|
1411
|
+
#[inline]
|
|
1412
|
+
#[stable(feature = "option_deref", since = "1.40.0")]
|
|
1413
|
+
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
|
|
1414
|
+
pub const fn as_deref_mut(&mut self) -> Option<&mut T::Target>
|
|
1415
|
+
where
|
|
1416
|
+
T: [const] DerefMut,
|
|
1417
|
+
{
|
|
1418
|
+
self.as_mut().map(DerefMut::deref_mut)
|
|
1419
|
+
}
|
|
1420
|
+
|
|
1421
|
+
/////////////////////////////////////////////////////////////////////////
|
|
1422
|
+
// Iterator constructors
|
|
1423
|
+
/////////////////////////////////////////////////////////////////////////
|
|
1424
|
+
|
|
1425
|
+
/// Returns an iterator over the possibly contained value.
|
|
1426
|
+
///
|
|
1427
|
+
/// # Examples
|
|
1428
|
+
///
|
|
1429
|
+
/// ```
|
|
1430
|
+
/// let x = Some(4);
|
|
1431
|
+
/// assert_eq!(x.iter().next(), Some(&4));
|
|
1432
|
+
///
|
|
1433
|
+
/// let x: Option<u32> = None;
|
|
1434
|
+
/// assert_eq!(x.iter().next(), None);
|
|
1435
|
+
/// ```
|
|
1436
|
+
#[inline]
|
|
1437
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
1438
|
+
pub fn iter(&self) -> Iter<'_, T> {
|
|
1439
|
+
Iter { inner: Item { opt: self.as_ref() } }
|
|
1440
|
+
}
|
|
1441
|
+
|
|
1442
|
+
/// Returns a mutable iterator over the possibly contained value.
|
|
1443
|
+
///
|
|
1444
|
+
/// # Examples
|
|
1445
|
+
///
|
|
1446
|
+
/// ```
|
|
1447
|
+
/// let mut x = Some(4);
|
|
1448
|
+
/// match x.iter_mut().next() {
|
|
1449
|
+
/// Some(v) => *v = 42,
|
|
1450
|
+
/// None => {},
|
|
1451
|
+
/// }
|
|
1452
|
+
/// assert_eq!(x, Some(42));
|
|
1453
|
+
///
|
|
1454
|
+
/// let mut x: Option<u32> = None;
|
|
1455
|
+
/// assert_eq!(x.iter_mut().next(), None);
|
|
1456
|
+
/// ```
|
|
1457
|
+
#[inline]
|
|
1458
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
1459
|
+
pub fn iter_mut(&mut self) -> IterMut<'_, T> {
|
|
1460
|
+
IterMut { inner: Item { opt: self.as_mut() } }
|
|
1461
|
+
}
|
|
1462
|
+
|
|
1463
|
+
/////////////////////////////////////////////////////////////////////////
|
|
1464
|
+
// Boolean operations on the values, eager and lazy
|
|
1465
|
+
/////////////////////////////////////////////////////////////////////////
|
|
1466
|
+
|
|
1467
|
+
/// Returns [`None`] if the option is [`None`], otherwise returns `optb`.
|
|
1468
|
+
///
|
|
1469
|
+
/// Arguments passed to `and` are eagerly evaluated; if you are passing the
|
|
1470
|
+
/// result of a function call, it is recommended to use [`and_then`], which is
|
|
1471
|
+
/// lazily evaluated.
|
|
1472
|
+
///
|
|
1473
|
+
/// [`and_then`]: Option::and_then
|
|
1474
|
+
///
|
|
1475
|
+
/// # Examples
|
|
1476
|
+
///
|
|
1477
|
+
/// ```
|
|
1478
|
+
/// let x = Some(2);
|
|
1479
|
+
/// let y: Option<&str> = None;
|
|
1480
|
+
/// assert_eq!(x.and(y), None);
|
|
1481
|
+
///
|
|
1482
|
+
/// let x: Option<u32> = None;
|
|
1483
|
+
/// let y = Some("foo");
|
|
1484
|
+
/// assert_eq!(x.and(y), None);
|
|
1485
|
+
///
|
|
1486
|
+
/// let x = Some(2);
|
|
1487
|
+
/// let y = Some("foo");
|
|
1488
|
+
/// assert_eq!(x.and(y), Some("foo"));
|
|
1489
|
+
///
|
|
1490
|
+
/// let x: Option<u32> = None;
|
|
1491
|
+
/// let y: Option<&str> = None;
|
|
1492
|
+
/// assert_eq!(x.and(y), None);
|
|
1493
|
+
/// ```
|
|
1494
|
+
#[inline]
|
|
1495
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
1496
|
+
#[rustc_const_unstable(feature = "const_option_ops", issue = "143956")]
|
|
1497
|
+
pub const fn and<U>(self, optb: Option<U>) -> Option<U>
|
|
1498
|
+
where
|
|
1499
|
+
T: [const] Destruct,
|
|
1500
|
+
U: [const] Destruct,
|
|
1501
|
+
{
|
|
1502
|
+
match self {
|
|
1503
|
+
Some(_) => optb,
|
|
1504
|
+
None => None,
|
|
1505
|
+
}
|
|
1506
|
+
}
|
|
1507
|
+
|
|
1508
|
+
/// Returns [`None`] if the option is [`None`], otherwise calls `f` with the
|
|
1509
|
+
/// wrapped value and returns the result.
|
|
1510
|
+
///
|
|
1511
|
+
/// Some languages call this operation flatmap.
|
|
1512
|
+
///
|
|
1513
|
+
/// # Examples
|
|
1514
|
+
///
|
|
1515
|
+
/// ```
|
|
1516
|
+
/// fn sq_then_to_string(x: u32) -> Option<String> {
|
|
1517
|
+
/// x.checked_mul(x).map(|sq| sq.to_string())
|
|
1518
|
+
/// }
|
|
1519
|
+
///
|
|
1520
|
+
/// assert_eq!(Some(2).and_then(sq_then_to_string), Some(4.to_string()));
|
|
1521
|
+
/// assert_eq!(Some(1_000_000).and_then(sq_then_to_string), None); // overflowed!
|
|
1522
|
+
/// assert_eq!(None.and_then(sq_then_to_string), None);
|
|
1523
|
+
/// ```
|
|
1524
|
+
///
|
|
1525
|
+
/// Often used to chain fallible operations that may return [`None`].
|
|
1526
|
+
///
|
|
1527
|
+
/// ```
|
|
1528
|
+
/// let arr_2d = [["A0", "A1"], ["B0", "B1"]];
|
|
1529
|
+
///
|
|
1530
|
+
/// let item_0_1 = arr_2d.get(0).and_then(|row| row.get(1));
|
|
1531
|
+
/// assert_eq!(item_0_1, Some(&"A1"));
|
|
1532
|
+
///
|
|
1533
|
+
/// let item_2_0 = arr_2d.get(2).and_then(|row| row.get(0));
|
|
1534
|
+
/// assert_eq!(item_2_0, None);
|
|
1535
|
+
/// ```
|
|
1536
|
+
#[doc(alias = "flatmap")]
|
|
1537
|
+
#[inline]
|
|
1538
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
1539
|
+
#[rustc_confusables("flat_map", "flatmap")]
|
|
1540
|
+
#[rustc_const_unstable(feature = "const_option_ops", issue = "143956")]
|
|
1541
|
+
pub const fn and_then<U, F>(self, f: F) -> Option<U>
|
|
1542
|
+
where
|
|
1543
|
+
F: [const] FnOnce(T) -> Option<U> + [const] Destruct,
|
|
1544
|
+
{
|
|
1545
|
+
match self {
|
|
1546
|
+
Some(x) => f(x),
|
|
1547
|
+
None => None,
|
|
1548
|
+
}
|
|
1549
|
+
}
|
|
1550
|
+
|
|
1551
|
+
/// Returns [`None`] if the option is [`None`], otherwise calls `predicate`
|
|
1552
|
+
/// with the wrapped value and returns:
|
|
1553
|
+
///
|
|
1554
|
+
/// - [`Some(t)`] if `predicate` returns `true` (where `t` is the wrapped
|
|
1555
|
+
/// value), and
|
|
1556
|
+
/// - [`None`] if `predicate` returns `false`.
|
|
1557
|
+
///
|
|
1558
|
+
/// This function works similar to [`Iterator::filter()`]. You can imagine
|
|
1559
|
+
/// the `Option<T>` being an iterator over one or zero elements. `filter()`
|
|
1560
|
+
/// lets you decide which elements to keep.
|
|
1561
|
+
///
|
|
1562
|
+
/// # Examples
|
|
1563
|
+
///
|
|
1564
|
+
/// ```rust
|
|
1565
|
+
/// fn is_even(n: &i32) -> bool {
|
|
1566
|
+
/// n % 2 == 0
|
|
1567
|
+
/// }
|
|
1568
|
+
///
|
|
1569
|
+
/// assert_eq!(None.filter(is_even), None);
|
|
1570
|
+
/// assert_eq!(Some(3).filter(is_even), None);
|
|
1571
|
+
/// assert_eq!(Some(4).filter(is_even), Some(4));
|
|
1572
|
+
/// ```
|
|
1573
|
+
///
|
|
1574
|
+
/// [`Some(t)`]: Some
|
|
1575
|
+
#[inline]
|
|
1576
|
+
#[stable(feature = "option_filter", since = "1.27.0")]
|
|
1577
|
+
#[rustc_const_unstable(feature = "const_option_ops", issue = "143956")]
|
|
1578
|
+
pub const fn filter<P>(self, predicate: P) -> Self
|
|
1579
|
+
where
|
|
1580
|
+
P: [const] FnOnce(&T) -> bool + [const] Destruct,
|
|
1581
|
+
T: [const] Destruct,
|
|
1582
|
+
{
|
|
1583
|
+
if let Some(x) = self {
|
|
1584
|
+
if predicate(&x) {
|
|
1585
|
+
return Some(x);
|
|
1586
|
+
}
|
|
1587
|
+
}
|
|
1588
|
+
None
|
|
1589
|
+
}
|
|
1590
|
+
|
|
1591
|
+
/// Returns the option if it contains a value, otherwise returns `optb`.
|
|
1592
|
+
///
|
|
1593
|
+
/// Arguments passed to `or` are eagerly evaluated; if you are passing the
|
|
1594
|
+
/// result of a function call, it is recommended to use [`or_else`], which is
|
|
1595
|
+
/// lazily evaluated.
|
|
1596
|
+
///
|
|
1597
|
+
/// [`or_else`]: Option::or_else
|
|
1598
|
+
///
|
|
1599
|
+
/// # Examples
|
|
1600
|
+
///
|
|
1601
|
+
/// ```
|
|
1602
|
+
/// let x = Some(2);
|
|
1603
|
+
/// let y = None;
|
|
1604
|
+
/// assert_eq!(x.or(y), Some(2));
|
|
1605
|
+
///
|
|
1606
|
+
/// let x = None;
|
|
1607
|
+
/// let y = Some(100);
|
|
1608
|
+
/// assert_eq!(x.or(y), Some(100));
|
|
1609
|
+
///
|
|
1610
|
+
/// let x = Some(2);
|
|
1611
|
+
/// let y = Some(100);
|
|
1612
|
+
/// assert_eq!(x.or(y), Some(2));
|
|
1613
|
+
///
|
|
1614
|
+
/// let x: Option<u32> = None;
|
|
1615
|
+
/// let y = None;
|
|
1616
|
+
/// assert_eq!(x.or(y), None);
|
|
1617
|
+
/// ```
|
|
1618
|
+
#[inline]
|
|
1619
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
1620
|
+
#[rustc_const_unstable(feature = "const_option_ops", issue = "143956")]
|
|
1621
|
+
pub const fn or(self, optb: Option<T>) -> Option<T>
|
|
1622
|
+
where
|
|
1623
|
+
T: [const] Destruct,
|
|
1624
|
+
{
|
|
1625
|
+
match self {
|
|
1626
|
+
x @ Some(_) => x,
|
|
1627
|
+
None => optb,
|
|
1628
|
+
}
|
|
1629
|
+
}
|
|
1630
|
+
|
|
1631
|
+
/// Returns the option if it contains a value, otherwise calls `f` and
|
|
1632
|
+
/// returns the result.
|
|
1633
|
+
///
|
|
1634
|
+
/// # Examples
|
|
1635
|
+
///
|
|
1636
|
+
/// ```
|
|
1637
|
+
/// fn nobody() -> Option<&'static str> { None }
|
|
1638
|
+
/// fn vikings() -> Option<&'static str> { Some("vikings") }
|
|
1639
|
+
///
|
|
1640
|
+
/// assert_eq!(Some("barbarians").or_else(vikings), Some("barbarians"));
|
|
1641
|
+
/// assert_eq!(None.or_else(vikings), Some("vikings"));
|
|
1642
|
+
/// assert_eq!(None.or_else(nobody), None);
|
|
1643
|
+
/// ```
|
|
1644
|
+
#[inline]
|
|
1645
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
1646
|
+
#[rustc_const_unstable(feature = "const_option_ops", issue = "143956")]
|
|
1647
|
+
pub const fn or_else<F>(self, f: F) -> Option<T>
|
|
1648
|
+
where
|
|
1649
|
+
F: [const] FnOnce() -> Option<T> + [const] Destruct,
|
|
1650
|
+
//FIXME(const_hack): this `T: [const] Destruct` is unnecessary, but even precise live drops can't tell
|
|
1651
|
+
// no value of type `T` gets dropped here
|
|
1652
|
+
T: [const] Destruct,
|
|
1653
|
+
{
|
|
1654
|
+
match self {
|
|
1655
|
+
x @ Some(_) => x,
|
|
1656
|
+
None => f(),
|
|
1657
|
+
}
|
|
1658
|
+
}
|
|
1659
|
+
|
|
1660
|
+
/// Returns [`Some`] if exactly one of `self`, `optb` is [`Some`], otherwise returns [`None`].
|
|
1661
|
+
///
|
|
1662
|
+
/// # Examples
|
|
1663
|
+
///
|
|
1664
|
+
/// ```
|
|
1665
|
+
/// let x = Some(2);
|
|
1666
|
+
/// let y: Option<u32> = None;
|
|
1667
|
+
/// assert_eq!(x.xor(y), Some(2));
|
|
1668
|
+
///
|
|
1669
|
+
/// let x: Option<u32> = None;
|
|
1670
|
+
/// let y = Some(2);
|
|
1671
|
+
/// assert_eq!(x.xor(y), Some(2));
|
|
1672
|
+
///
|
|
1673
|
+
/// let x = Some(2);
|
|
1674
|
+
/// let y = Some(2);
|
|
1675
|
+
/// assert_eq!(x.xor(y), None);
|
|
1676
|
+
///
|
|
1677
|
+
/// let x: Option<u32> = None;
|
|
1678
|
+
/// let y: Option<u32> = None;
|
|
1679
|
+
/// assert_eq!(x.xor(y), None);
|
|
1680
|
+
/// ```
|
|
1681
|
+
#[inline]
|
|
1682
|
+
#[stable(feature = "option_xor", since = "1.37.0")]
|
|
1683
|
+
#[rustc_const_unstable(feature = "const_option_ops", issue = "143956")]
|
|
1684
|
+
pub const fn xor(self, optb: Option<T>) -> Option<T>
|
|
1685
|
+
where
|
|
1686
|
+
T: [const] Destruct,
|
|
1687
|
+
{
|
|
1688
|
+
match (self, optb) {
|
|
1689
|
+
(a @ Some(_), None) => a,
|
|
1690
|
+
(None, b @ Some(_)) => b,
|
|
1691
|
+
_ => None,
|
|
1692
|
+
}
|
|
1693
|
+
}
|
|
1694
|
+
|
|
1695
|
+
/////////////////////////////////////////////////////////////////////////
|
|
1696
|
+
// Entry-like operations to insert a value and return a reference
|
|
1697
|
+
/////////////////////////////////////////////////////////////////////////
|
|
1698
|
+
|
|
1699
|
+
/// Inserts `value` into the option, then returns a mutable reference to it.
|
|
1700
|
+
///
|
|
1701
|
+
/// If the option already contains a value, the old value is dropped.
|
|
1702
|
+
///
|
|
1703
|
+
/// See also [`Option::get_or_insert`], which doesn't update the value if
|
|
1704
|
+
/// the option already contains [`Some`].
|
|
1705
|
+
///
|
|
1706
|
+
/// # Example
|
|
1707
|
+
///
|
|
1708
|
+
/// ```
|
|
1709
|
+
/// let mut opt = None;
|
|
1710
|
+
/// let val = opt.insert(1);
|
|
1711
|
+
/// assert_eq!(*val, 1);
|
|
1712
|
+
/// assert_eq!(opt.unwrap(), 1);
|
|
1713
|
+
/// let val = opt.insert(2);
|
|
1714
|
+
/// assert_eq!(*val, 2);
|
|
1715
|
+
/// *val = 3;
|
|
1716
|
+
/// assert_eq!(opt.unwrap(), 3);
|
|
1717
|
+
/// ```
|
|
1718
|
+
#[must_use = "if you intended to set a value, consider assignment instead"]
|
|
1719
|
+
#[inline]
|
|
1720
|
+
#[stable(feature = "option_insert", since = "1.53.0")]
|
|
1721
|
+
#[rustc_const_unstable(feature = "const_option_ops", issue = "143956")]
|
|
1722
|
+
pub const fn insert(&mut self, value: T) -> &mut T
|
|
1723
|
+
where
|
|
1724
|
+
T: [const] Destruct,
|
|
1725
|
+
{
|
|
1726
|
+
*self = Some(value);
|
|
1727
|
+
|
|
1728
|
+
// SAFETY: the code above just filled the option
|
|
1729
|
+
unsafe { self.as_mut().unwrap_unchecked() }
|
|
1730
|
+
}
|
|
1731
|
+
|
|
1732
|
+
/// Inserts `value` into the option if it is [`None`], then
|
|
1733
|
+
/// returns a mutable reference to the contained value.
|
|
1734
|
+
///
|
|
1735
|
+
/// See also [`Option::insert`], which updates the value even if
|
|
1736
|
+
/// the option already contains [`Some`].
|
|
1737
|
+
///
|
|
1738
|
+
/// # Examples
|
|
1739
|
+
///
|
|
1740
|
+
/// ```
|
|
1741
|
+
/// let mut x = None;
|
|
1742
|
+
///
|
|
1743
|
+
/// {
|
|
1744
|
+
/// let y: &mut u32 = x.get_or_insert(5);
|
|
1745
|
+
/// assert_eq!(y, &5);
|
|
1746
|
+
///
|
|
1747
|
+
/// *y = 7;
|
|
1748
|
+
/// }
|
|
1749
|
+
///
|
|
1750
|
+
/// assert_eq!(x, Some(7));
|
|
1751
|
+
/// ```
|
|
1752
|
+
#[inline]
|
|
1753
|
+
#[stable(feature = "option_entry", since = "1.20.0")]
|
|
1754
|
+
pub fn get_or_insert(&mut self, value: T) -> &mut T {
|
|
1755
|
+
self.get_or_insert_with(|| value)
|
|
1756
|
+
}
|
|
1757
|
+
|
|
1758
|
+
/// Inserts the default value into the option if it is [`None`], then
|
|
1759
|
+
/// returns a mutable reference to the contained value.
|
|
1760
|
+
///
|
|
1761
|
+
/// # Examples
|
|
1762
|
+
///
|
|
1763
|
+
/// ```
|
|
1764
|
+
/// let mut x = None;
|
|
1765
|
+
///
|
|
1766
|
+
/// {
|
|
1767
|
+
/// let y: &mut u32 = x.get_or_insert_default();
|
|
1768
|
+
/// assert_eq!(y, &0);
|
|
1769
|
+
///
|
|
1770
|
+
/// *y = 7;
|
|
1771
|
+
/// }
|
|
1772
|
+
///
|
|
1773
|
+
/// assert_eq!(x, Some(7));
|
|
1774
|
+
/// ```
|
|
1775
|
+
#[inline]
|
|
1776
|
+
#[stable(feature = "option_get_or_insert_default", since = "1.83.0")]
|
|
1777
|
+
#[rustc_const_unstable(feature = "const_option_ops", issue = "143956")]
|
|
1778
|
+
pub const fn get_or_insert_default(&mut self) -> &mut T
|
|
1779
|
+
where
|
|
1780
|
+
T: [const] Default + [const] Destruct,
|
|
1781
|
+
{
|
|
1782
|
+
self.get_or_insert_with(T::default)
|
|
1783
|
+
}
|
|
1784
|
+
|
|
1785
|
+
/// Inserts a value computed from `f` into the option if it is [`None`],
|
|
1786
|
+
/// then returns a mutable reference to the contained value.
|
|
1787
|
+
///
|
|
1788
|
+
/// # Examples
|
|
1789
|
+
///
|
|
1790
|
+
/// ```
|
|
1791
|
+
/// let mut x = None;
|
|
1792
|
+
///
|
|
1793
|
+
/// {
|
|
1794
|
+
/// let y: &mut u32 = x.get_or_insert_with(|| 5);
|
|
1795
|
+
/// assert_eq!(y, &5);
|
|
1796
|
+
///
|
|
1797
|
+
/// *y = 7;
|
|
1798
|
+
/// }
|
|
1799
|
+
///
|
|
1800
|
+
/// assert_eq!(x, Some(7));
|
|
1801
|
+
/// ```
|
|
1802
|
+
#[inline]
|
|
1803
|
+
#[stable(feature = "option_entry", since = "1.20.0")]
|
|
1804
|
+
#[rustc_const_unstable(feature = "const_option_ops", issue = "143956")]
|
|
1805
|
+
pub const fn get_or_insert_with<F>(&mut self, f: F) -> &mut T
|
|
1806
|
+
where
|
|
1807
|
+
F: [const] FnOnce() -> T + [const] Destruct,
|
|
1808
|
+
T: [const] Destruct,
|
|
1809
|
+
{
|
|
1810
|
+
if let None = self {
|
|
1811
|
+
*self = Some(f());
|
|
1812
|
+
}
|
|
1813
|
+
|
|
1814
|
+
// SAFETY: a `None` variant for `self` would have been replaced by a `Some`
|
|
1815
|
+
// variant in the code above.
|
|
1816
|
+
unsafe { self.as_mut().unwrap_unchecked() }
|
|
1817
|
+
}
|
|
1818
|
+
|
|
1819
|
+
/////////////////////////////////////////////////////////////////////////
|
|
1820
|
+
// Misc
|
|
1821
|
+
/////////////////////////////////////////////////////////////////////////
|
|
1822
|
+
|
|
1823
|
+
/// Takes the value out of the option, leaving a [`None`] in its place.
|
|
1824
|
+
///
|
|
1825
|
+
/// # Examples
|
|
1826
|
+
///
|
|
1827
|
+
/// ```
|
|
1828
|
+
/// let mut x = Some(2);
|
|
1829
|
+
/// let y = x.take();
|
|
1830
|
+
/// assert_eq!(x, None);
|
|
1831
|
+
/// assert_eq!(y, Some(2));
|
|
1832
|
+
///
|
|
1833
|
+
/// let mut x: Option<u32> = None;
|
|
1834
|
+
/// let y = x.take();
|
|
1835
|
+
/// assert_eq!(x, None);
|
|
1836
|
+
/// assert_eq!(y, None);
|
|
1837
|
+
/// ```
|
|
1838
|
+
#[inline]
|
|
1839
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
1840
|
+
#[rustc_const_stable(feature = "const_option", since = "1.83.0")]
|
|
1841
|
+
pub const fn take(&mut self) -> Option<T> {
|
|
1842
|
+
// FIXME(const-hack) replace `mem::replace` by `mem::take` when the latter is const ready
|
|
1843
|
+
mem::replace(self, None)
|
|
1844
|
+
}
|
|
1845
|
+
|
|
1846
|
+
/// Takes the value out of the option, but only if the predicate evaluates to
|
|
1847
|
+
/// `true` on a mutable reference to the value.
|
|
1848
|
+
///
|
|
1849
|
+
/// In other words, replaces `self` with `None` if the predicate returns `true`.
|
|
1850
|
+
/// This method operates similar to [`Option::take`] but conditional.
|
|
1851
|
+
///
|
|
1852
|
+
/// # Examples
|
|
1853
|
+
///
|
|
1854
|
+
/// ```
|
|
1855
|
+
/// let mut x = Some(42);
|
|
1856
|
+
///
|
|
1857
|
+
/// let prev = x.take_if(|v| if *v == 42 {
|
|
1858
|
+
/// *v += 1;
|
|
1859
|
+
/// false
|
|
1860
|
+
/// } else {
|
|
1861
|
+
/// false
|
|
1862
|
+
/// });
|
|
1863
|
+
/// assert_eq!(x, Some(43));
|
|
1864
|
+
/// assert_eq!(prev, None);
|
|
1865
|
+
///
|
|
1866
|
+
/// let prev = x.take_if(|v| *v == 43);
|
|
1867
|
+
/// assert_eq!(x, None);
|
|
1868
|
+
/// assert_eq!(prev, Some(43));
|
|
1869
|
+
/// ```
|
|
1870
|
+
#[inline]
|
|
1871
|
+
#[stable(feature = "option_take_if", since = "1.80.0")]
|
|
1872
|
+
#[rustc_const_unstable(feature = "const_option_ops", issue = "143956")]
|
|
1873
|
+
pub const fn take_if<P>(&mut self, predicate: P) -> Option<T>
|
|
1874
|
+
where
|
|
1875
|
+
P: [const] FnOnce(&mut T) -> bool + [const] Destruct,
|
|
1876
|
+
{
|
|
1877
|
+
if self.as_mut().map_or(false, predicate) { self.take() } else { None }
|
|
1878
|
+
}
|
|
1879
|
+
|
|
1880
|
+
/// Replaces the actual value in the option by the value given in parameter,
|
|
1881
|
+
/// returning the old value if present,
|
|
1882
|
+
/// leaving a [`Some`] in its place without deinitializing either one.
|
|
1883
|
+
///
|
|
1884
|
+
/// # Examples
|
|
1885
|
+
///
|
|
1886
|
+
/// ```
|
|
1887
|
+
/// let mut x = Some(2);
|
|
1888
|
+
/// let old = x.replace(5);
|
|
1889
|
+
/// assert_eq!(x, Some(5));
|
|
1890
|
+
/// assert_eq!(old, Some(2));
|
|
1891
|
+
///
|
|
1892
|
+
/// let mut x = None;
|
|
1893
|
+
/// let old = x.replace(3);
|
|
1894
|
+
/// assert_eq!(x, Some(3));
|
|
1895
|
+
/// assert_eq!(old, None);
|
|
1896
|
+
/// ```
|
|
1897
|
+
#[inline]
|
|
1898
|
+
#[stable(feature = "option_replace", since = "1.31.0")]
|
|
1899
|
+
#[rustc_const_stable(feature = "const_option", since = "1.83.0")]
|
|
1900
|
+
pub const fn replace(&mut self, value: T) -> Option<T> {
|
|
1901
|
+
mem::replace(self, Some(value))
|
|
1902
|
+
}
|
|
1903
|
+
|
|
1904
|
+
/// Zips `self` with another `Option`.
|
|
1905
|
+
///
|
|
1906
|
+
/// If `self` is `Some(s)` and `other` is `Some(o)`, this method returns `Some((s, o))`.
|
|
1907
|
+
/// Otherwise, `None` is returned.
|
|
1908
|
+
///
|
|
1909
|
+
/// # Examples
|
|
1910
|
+
///
|
|
1911
|
+
/// ```
|
|
1912
|
+
/// let x = Some(1);
|
|
1913
|
+
/// let y = Some("hi");
|
|
1914
|
+
/// let z = None::<u8>;
|
|
1915
|
+
///
|
|
1916
|
+
/// assert_eq!(x.zip(y), Some((1, "hi")));
|
|
1917
|
+
/// assert_eq!(x.zip(z), None);
|
|
1918
|
+
/// ```
|
|
1919
|
+
#[stable(feature = "option_zip_option", since = "1.46.0")]
|
|
1920
|
+
#[rustc_const_unstable(feature = "const_option_ops", issue = "143956")]
|
|
1921
|
+
pub const fn zip<U>(self, other: Option<U>) -> Option<(T, U)>
|
|
1922
|
+
where
|
|
1923
|
+
T: [const] Destruct,
|
|
1924
|
+
U: [const] Destruct,
|
|
1925
|
+
{
|
|
1926
|
+
match (self, other) {
|
|
1927
|
+
(Some(a), Some(b)) => Some((a, b)),
|
|
1928
|
+
_ => None,
|
|
1929
|
+
}
|
|
1930
|
+
}
|
|
1931
|
+
|
|
1932
|
+
/// Zips `self` and another `Option` with function `f`.
|
|
1933
|
+
///
|
|
1934
|
+
/// If `self` is `Some(s)` and `other` is `Some(o)`, this method returns `Some(f(s, o))`.
|
|
1935
|
+
/// Otherwise, `None` is returned.
|
|
1936
|
+
///
|
|
1937
|
+
/// # Examples
|
|
1938
|
+
///
|
|
1939
|
+
/// ```
|
|
1940
|
+
/// #![feature(option_zip)]
|
|
1941
|
+
///
|
|
1942
|
+
/// #[derive(Debug, PartialEq)]
|
|
1943
|
+
/// struct Point {
|
|
1944
|
+
/// x: f64,
|
|
1945
|
+
/// y: f64,
|
|
1946
|
+
/// }
|
|
1947
|
+
///
|
|
1948
|
+
/// impl Point {
|
|
1949
|
+
/// fn new(x: f64, y: f64) -> Self {
|
|
1950
|
+
/// Self { x, y }
|
|
1951
|
+
/// }
|
|
1952
|
+
/// }
|
|
1953
|
+
///
|
|
1954
|
+
/// let x = Some(17.5);
|
|
1955
|
+
/// let y = Some(42.7);
|
|
1956
|
+
///
|
|
1957
|
+
/// assert_eq!(x.zip_with(y, Point::new), Some(Point { x: 17.5, y: 42.7 }));
|
|
1958
|
+
/// assert_eq!(x.zip_with(None, Point::new), None);
|
|
1959
|
+
/// ```
|
|
1960
|
+
#[unstable(feature = "option_zip", issue = "70086")]
|
|
1961
|
+
#[rustc_const_unstable(feature = "const_option_ops", issue = "143956")]
|
|
1962
|
+
pub const fn zip_with<U, F, R>(self, other: Option<U>, f: F) -> Option<R>
|
|
1963
|
+
where
|
|
1964
|
+
F: [const] FnOnce(T, U) -> R + [const] Destruct,
|
|
1965
|
+
T: [const] Destruct,
|
|
1966
|
+
U: [const] Destruct,
|
|
1967
|
+
{
|
|
1968
|
+
match (self, other) {
|
|
1969
|
+
(Some(a), Some(b)) => Some(f(a, b)),
|
|
1970
|
+
_ => None,
|
|
1971
|
+
}
|
|
1972
|
+
}
|
|
1973
|
+
|
|
1974
|
+
/// Reduces two options into one, using the provided function if both are `Some`.
|
|
1975
|
+
///
|
|
1976
|
+
/// If `self` is `Some(s)` and `other` is `Some(o)`, this method returns `Some(f(s, o))`.
|
|
1977
|
+
/// Otherwise, if only one of `self` and `other` is `Some`, that one is returned.
|
|
1978
|
+
/// If both `self` and `other` are `None`, `None` is returned.
|
|
1979
|
+
///
|
|
1980
|
+
/// # Examples
|
|
1981
|
+
///
|
|
1982
|
+
/// ```
|
|
1983
|
+
/// #![feature(option_reduce)]
|
|
1984
|
+
///
|
|
1985
|
+
/// let s12 = Some(12);
|
|
1986
|
+
/// let s17 = Some(17);
|
|
1987
|
+
/// let n = None;
|
|
1988
|
+
/// let f = |a, b| a + b;
|
|
1989
|
+
///
|
|
1990
|
+
/// assert_eq!(s12.reduce(s17, f), Some(29));
|
|
1991
|
+
/// assert_eq!(s12.reduce(n, f), Some(12));
|
|
1992
|
+
/// assert_eq!(n.reduce(s17, f), Some(17));
|
|
1993
|
+
/// assert_eq!(n.reduce(n, f), None);
|
|
1994
|
+
/// ```
|
|
1995
|
+
#[unstable(feature = "option_reduce", issue = "144273")]
|
|
1996
|
+
pub fn reduce<U, R, F>(self, other: Option<U>, f: F) -> Option<R>
|
|
1997
|
+
where
|
|
1998
|
+
T: Into<R>,
|
|
1999
|
+
U: Into<R>,
|
|
2000
|
+
F: FnOnce(T, U) -> R,
|
|
2001
|
+
{
|
|
2002
|
+
match (self, other) {
|
|
2003
|
+
(Some(a), Some(b)) => Some(f(a, b)),
|
|
2004
|
+
(Some(a), _) => Some(a.into()),
|
|
2005
|
+
(_, Some(b)) => Some(b.into()),
|
|
2006
|
+
_ => None,
|
|
2007
|
+
}
|
|
2008
|
+
}
|
|
2009
|
+
}
|
|
2010
|
+
|
|
2011
|
+
impl<T: IntoIterator> Option<T> {
|
|
2012
|
+
/// Transforms an optional iterator into an iterator.
|
|
2013
|
+
///
|
|
2014
|
+
/// If `self` is `None`, the resulting iterator is empty.
|
|
2015
|
+
/// Otherwise, an iterator is made from the `Some` value and returned.
|
|
2016
|
+
/// # Examples
|
|
2017
|
+
/// ```
|
|
2018
|
+
/// #![feature(option_into_flat_iter)]
|
|
2019
|
+
///
|
|
2020
|
+
/// let o1 = Some([1, 2]);
|
|
2021
|
+
/// let o2 = None::<&[usize]>;
|
|
2022
|
+
///
|
|
2023
|
+
/// assert_eq!(o1.into_flat_iter().collect::<Vec<_>>(), [1, 2]);
|
|
2024
|
+
/// assert_eq!(o2.into_flat_iter().collect::<Vec<_>>(), Vec::<&usize>::new());
|
|
2025
|
+
/// ```
|
|
2026
|
+
#[unstable(feature = "option_into_flat_iter", issue = "148441")]
|
|
2027
|
+
pub fn into_flat_iter<A>(self) -> OptionFlatten<A>
|
|
2028
|
+
where
|
|
2029
|
+
T: IntoIterator<IntoIter = A>,
|
|
2030
|
+
{
|
|
2031
|
+
OptionFlatten { iter: self.map(IntoIterator::into_iter) }
|
|
2032
|
+
}
|
|
2033
|
+
}
|
|
2034
|
+
|
|
2035
|
+
impl<T, U> Option<(T, U)> {
|
|
2036
|
+
/// Unzips an option containing a tuple of two options.
|
|
2037
|
+
///
|
|
2038
|
+
/// If `self` is `Some((a, b))` this method returns `(Some(a), Some(b))`.
|
|
2039
|
+
/// Otherwise, `(None, None)` is returned.
|
|
2040
|
+
///
|
|
2041
|
+
/// # Examples
|
|
2042
|
+
///
|
|
2043
|
+
/// ```
|
|
2044
|
+
/// let x = Some((1, "hi"));
|
|
2045
|
+
/// let y = None::<(u8, u32)>;
|
|
2046
|
+
///
|
|
2047
|
+
/// assert_eq!(x.unzip(), (Some(1), Some("hi")));
|
|
2048
|
+
/// assert_eq!(y.unzip(), (None, None));
|
|
2049
|
+
/// ```
|
|
2050
|
+
#[inline]
|
|
2051
|
+
#[stable(feature = "unzip_option", since = "1.66.0")]
|
|
2052
|
+
pub fn unzip(self) -> (Option<T>, Option<U>) {
|
|
2053
|
+
match self {
|
|
2054
|
+
Some((a, b)) => (Some(a), Some(b)),
|
|
2055
|
+
None => (None, None),
|
|
2056
|
+
}
|
|
2057
|
+
}
|
|
2058
|
+
}
|
|
2059
|
+
|
|
2060
|
+
impl<T> Option<&T> {
|
|
2061
|
+
/// Maps an `Option<&T>` to an `Option<T>` by copying the contents of the
|
|
2062
|
+
/// option.
|
|
2063
|
+
///
|
|
2064
|
+
/// # Examples
|
|
2065
|
+
///
|
|
2066
|
+
/// ```
|
|
2067
|
+
/// let x = 12;
|
|
2068
|
+
/// let opt_x = Some(&x);
|
|
2069
|
+
/// assert_eq!(opt_x, Some(&12));
|
|
2070
|
+
/// let copied = opt_x.copied();
|
|
2071
|
+
/// assert_eq!(copied, Some(12));
|
|
2072
|
+
/// ```
|
|
2073
|
+
#[must_use = "`self` will be dropped if the result is not used"]
|
|
2074
|
+
#[stable(feature = "copied", since = "1.35.0")]
|
|
2075
|
+
#[rustc_const_stable(feature = "const_option", since = "1.83.0")]
|
|
2076
|
+
pub const fn copied(self) -> Option<T>
|
|
2077
|
+
where
|
|
2078
|
+
T: Copy,
|
|
2079
|
+
{
|
|
2080
|
+
// FIXME(const-hack): this implementation, which sidesteps using `Option::map` since it's not const
|
|
2081
|
+
// ready yet, should be reverted when possible to avoid code repetition
|
|
2082
|
+
match self {
|
|
2083
|
+
Some(&v) => Some(v),
|
|
2084
|
+
None => None,
|
|
2085
|
+
}
|
|
2086
|
+
}
|
|
2087
|
+
|
|
2088
|
+
/// Maps an `Option<&T>` to an `Option<T>` by cloning the contents of the
|
|
2089
|
+
/// option.
|
|
2090
|
+
///
|
|
2091
|
+
/// # Examples
|
|
2092
|
+
///
|
|
2093
|
+
/// ```
|
|
2094
|
+
/// let x = 12;
|
|
2095
|
+
/// let opt_x = Some(&x);
|
|
2096
|
+
/// assert_eq!(opt_x, Some(&12));
|
|
2097
|
+
/// let cloned = opt_x.cloned();
|
|
2098
|
+
/// assert_eq!(cloned, Some(12));
|
|
2099
|
+
/// ```
|
|
2100
|
+
#[must_use = "`self` will be dropped if the result is not used"]
|
|
2101
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
2102
|
+
pub fn cloned(self) -> Option<T>
|
|
2103
|
+
where
|
|
2104
|
+
T: Clone,
|
|
2105
|
+
{
|
|
2106
|
+
match self {
|
|
2107
|
+
Some(t) => Some(t.clone()),
|
|
2108
|
+
None => None,
|
|
2109
|
+
}
|
|
2110
|
+
}
|
|
2111
|
+
}
|
|
2112
|
+
|
|
2113
|
+
impl<T> Option<&mut T> {
|
|
2114
|
+
/// Maps an `Option<&mut T>` to an `Option<T>` by copying the contents of the
|
|
2115
|
+
/// option.
|
|
2116
|
+
///
|
|
2117
|
+
/// # Examples
|
|
2118
|
+
///
|
|
2119
|
+
/// ```
|
|
2120
|
+
/// let mut x = 12;
|
|
2121
|
+
/// let opt_x = Some(&mut x);
|
|
2122
|
+
/// assert_eq!(opt_x, Some(&mut 12));
|
|
2123
|
+
/// let copied = opt_x.copied();
|
|
2124
|
+
/// assert_eq!(copied, Some(12));
|
|
2125
|
+
/// ```
|
|
2126
|
+
#[must_use = "`self` will be dropped if the result is not used"]
|
|
2127
|
+
#[stable(feature = "copied", since = "1.35.0")]
|
|
2128
|
+
#[rustc_const_stable(feature = "const_option", since = "1.83.0")]
|
|
2129
|
+
pub const fn copied(self) -> Option<T>
|
|
2130
|
+
where
|
|
2131
|
+
T: Copy,
|
|
2132
|
+
{
|
|
2133
|
+
match self {
|
|
2134
|
+
Some(&mut t) => Some(t),
|
|
2135
|
+
None => None,
|
|
2136
|
+
}
|
|
2137
|
+
}
|
|
2138
|
+
|
|
2139
|
+
/// Maps an `Option<&mut T>` to an `Option<T>` by cloning the contents of the
|
|
2140
|
+
/// option.
|
|
2141
|
+
///
|
|
2142
|
+
/// # Examples
|
|
2143
|
+
///
|
|
2144
|
+
/// ```
|
|
2145
|
+
/// let mut x = 12;
|
|
2146
|
+
/// let opt_x = Some(&mut x);
|
|
2147
|
+
/// assert_eq!(opt_x, Some(&mut 12));
|
|
2148
|
+
/// let cloned = opt_x.cloned();
|
|
2149
|
+
/// assert_eq!(cloned, Some(12));
|
|
2150
|
+
/// ```
|
|
2151
|
+
#[must_use = "`self` will be dropped if the result is not used"]
|
|
2152
|
+
#[stable(since = "1.26.0", feature = "option_ref_mut_cloned")]
|
|
2153
|
+
pub fn cloned(self) -> Option<T>
|
|
2154
|
+
where
|
|
2155
|
+
T: Clone,
|
|
2156
|
+
{
|
|
2157
|
+
match self {
|
|
2158
|
+
Some(t) => Some(t.clone()),
|
|
2159
|
+
None => None,
|
|
2160
|
+
}
|
|
2161
|
+
}
|
|
2162
|
+
}
|
|
2163
|
+
|
|
2164
|
+
impl<T, E> Option<Result<T, E>> {
|
|
2165
|
+
/// Transposes an `Option` of a [`Result`] into a [`Result`] of an `Option`.
|
|
2166
|
+
///
|
|
2167
|
+
/// <code>[Some]\([Ok]\(\_))</code> is mapped to <code>[Ok]\([Some]\(\_))</code>,
|
|
2168
|
+
/// <code>[Some]\([Err]\(\_))</code> is mapped to <code>[Err]\(\_)</code>,
|
|
2169
|
+
/// and [`None`] will be mapped to <code>[Ok]\([None])</code>.
|
|
2170
|
+
///
|
|
2171
|
+
/// # Examples
|
|
2172
|
+
///
|
|
2173
|
+
/// ```
|
|
2174
|
+
/// #[derive(Debug, Eq, PartialEq)]
|
|
2175
|
+
/// struct SomeErr;
|
|
2176
|
+
///
|
|
2177
|
+
/// let x: Option<Result<i32, SomeErr>> = Some(Ok(5));
|
|
2178
|
+
/// let y: Result<Option<i32>, SomeErr> = Ok(Some(5));
|
|
2179
|
+
/// assert_eq!(x.transpose(), y);
|
|
2180
|
+
/// ```
|
|
2181
|
+
#[inline]
|
|
2182
|
+
#[stable(feature = "transpose_result", since = "1.33.0")]
|
|
2183
|
+
#[rustc_allow_const_fn_unstable(const_precise_live_drops)]
|
|
2184
|
+
#[rustc_const_stable(feature = "const_option", since = "1.83.0")]
|
|
2185
|
+
pub const fn transpose(self) -> Result<Option<T>, E> {
|
|
2186
|
+
match self {
|
|
2187
|
+
Some(Ok(x)) => Ok(Some(x)),
|
|
2188
|
+
Some(Err(e)) => Err(e),
|
|
2189
|
+
None => Ok(None),
|
|
2190
|
+
}
|
|
2191
|
+
}
|
|
2192
|
+
}
|
|
2193
|
+
|
|
2194
|
+
#[cfg_attr(not(panic = "immediate-abort"), inline(never))]
|
|
2195
|
+
#[cfg_attr(panic = "immediate-abort", inline)]
|
|
2196
|
+
#[cold]
|
|
2197
|
+
#[track_caller]
|
|
2198
|
+
const fn unwrap_failed() -> ! {
|
|
2199
|
+
panic("called `Option::unwrap()` on a `None` value")
|
|
2200
|
+
}
|
|
2201
|
+
|
|
2202
|
+
// This is a separate function to reduce the code size of .expect() itself.
|
|
2203
|
+
#[cfg_attr(not(panic = "immediate-abort"), inline(never))]
|
|
2204
|
+
#[cfg_attr(panic = "immediate-abort", inline)]
|
|
2205
|
+
#[cold]
|
|
2206
|
+
#[track_caller]
|
|
2207
|
+
const fn expect_failed(msg: &str) -> ! {
|
|
2208
|
+
panic_display(&msg)
|
|
2209
|
+
}
|
|
2210
|
+
|
|
2211
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
2212
|
+
// Trait implementations
|
|
2213
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
2214
|
+
|
|
2215
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
2216
|
+
#[rustc_const_unstable(feature = "const_clone", issue = "142757")]
|
|
2217
|
+
impl<T> const Clone for Option<T>
|
|
2218
|
+
where
|
|
2219
|
+
// FIXME(const_hack): the T: [const] Destruct should be inferred from the Self: [const] Destruct in clone_from.
|
|
2220
|
+
// See https://github.com/rust-lang/rust/issues/144207
|
|
2221
|
+
T: [const] Clone + [const] Destruct,
|
|
2222
|
+
{
|
|
2223
|
+
#[inline]
|
|
2224
|
+
fn clone(&self) -> Self {
|
|
2225
|
+
match self {
|
|
2226
|
+
Some(x) => Some(x.clone()),
|
|
2227
|
+
None => None,
|
|
2228
|
+
}
|
|
2229
|
+
}
|
|
2230
|
+
|
|
2231
|
+
#[inline]
|
|
2232
|
+
fn clone_from(&mut self, source: &Self) {
|
|
2233
|
+
match (self, source) {
|
|
2234
|
+
(Some(to), Some(from)) => to.clone_from(from),
|
|
2235
|
+
(to, from) => *to = from.clone(),
|
|
2236
|
+
}
|
|
2237
|
+
}
|
|
2238
|
+
}
|
|
2239
|
+
|
|
2240
|
+
#[unstable(feature = "ergonomic_clones", issue = "132290")]
|
|
2241
|
+
impl<T> crate::clone::UseCloned for Option<T> where T: crate::clone::UseCloned {}
|
|
2242
|
+
|
|
2243
|
+
#[doc(hidden)]
|
|
2244
|
+
#[unstable(feature = "trivial_clone", issue = "none")]
|
|
2245
|
+
#[rustc_const_unstable(feature = "const_clone", issue = "142757")]
|
|
2246
|
+
unsafe impl<T> const TrivialClone for Option<T> where T: [const] TrivialClone + [const] Destruct {}
|
|
2247
|
+
|
|
2248
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
2249
|
+
#[rustc_const_unstable(feature = "const_default", issue = "143894")]
|
|
2250
|
+
impl<T> const Default for Option<T> {
|
|
2251
|
+
/// Returns [`None`][Option::None].
|
|
2252
|
+
///
|
|
2253
|
+
/// # Examples
|
|
2254
|
+
///
|
|
2255
|
+
/// ```
|
|
2256
|
+
/// let opt: Option<u32> = Option::default();
|
|
2257
|
+
/// assert!(opt.is_none());
|
|
2258
|
+
/// ```
|
|
2259
|
+
#[inline]
|
|
2260
|
+
fn default() -> Option<T> {
|
|
2261
|
+
None
|
|
2262
|
+
}
|
|
2263
|
+
}
|
|
2264
|
+
|
|
2265
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
2266
|
+
impl<T> IntoIterator for Option<T> {
|
|
2267
|
+
type Item = T;
|
|
2268
|
+
type IntoIter = IntoIter<T>;
|
|
2269
|
+
|
|
2270
|
+
/// Returns a consuming iterator over the possibly contained value.
|
|
2271
|
+
///
|
|
2272
|
+
/// # Examples
|
|
2273
|
+
///
|
|
2274
|
+
/// ```
|
|
2275
|
+
/// let x = Some("string");
|
|
2276
|
+
/// let v: Vec<&str> = x.into_iter().collect();
|
|
2277
|
+
/// assert_eq!(v, ["string"]);
|
|
2278
|
+
///
|
|
2279
|
+
/// let x = None;
|
|
2280
|
+
/// let v: Vec<&str> = x.into_iter().collect();
|
|
2281
|
+
/// assert!(v.is_empty());
|
|
2282
|
+
/// ```
|
|
2283
|
+
#[inline]
|
|
2284
|
+
fn into_iter(self) -> IntoIter<T> {
|
|
2285
|
+
IntoIter { inner: Item { opt: self } }
|
|
2286
|
+
}
|
|
2287
|
+
}
|
|
2288
|
+
|
|
2289
|
+
#[stable(since = "1.4.0", feature = "option_iter")]
|
|
2290
|
+
impl<'a, T> IntoIterator for &'a Option<T> {
|
|
2291
|
+
type Item = &'a T;
|
|
2292
|
+
type IntoIter = Iter<'a, T>;
|
|
2293
|
+
|
|
2294
|
+
fn into_iter(self) -> Iter<'a, T> {
|
|
2295
|
+
self.iter()
|
|
2296
|
+
}
|
|
2297
|
+
}
|
|
2298
|
+
|
|
2299
|
+
#[stable(since = "1.4.0", feature = "option_iter")]
|
|
2300
|
+
impl<'a, T> IntoIterator for &'a mut Option<T> {
|
|
2301
|
+
type Item = &'a mut T;
|
|
2302
|
+
type IntoIter = IterMut<'a, T>;
|
|
2303
|
+
|
|
2304
|
+
fn into_iter(self) -> IterMut<'a, T> {
|
|
2305
|
+
self.iter_mut()
|
|
2306
|
+
}
|
|
2307
|
+
}
|
|
2308
|
+
|
|
2309
|
+
#[stable(since = "1.12.0", feature = "option_from")]
|
|
2310
|
+
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
|
|
2311
|
+
impl<T> const From<T> for Option<T> {
|
|
2312
|
+
/// Moves `val` into a new [`Some`].
|
|
2313
|
+
///
|
|
2314
|
+
/// # Examples
|
|
2315
|
+
///
|
|
2316
|
+
/// ```
|
|
2317
|
+
/// let o: Option<u8> = Option::from(67);
|
|
2318
|
+
///
|
|
2319
|
+
/// assert_eq!(Some(67), o);
|
|
2320
|
+
/// ```
|
|
2321
|
+
fn from(val: T) -> Option<T> {
|
|
2322
|
+
Some(val)
|
|
2323
|
+
}
|
|
2324
|
+
}
|
|
2325
|
+
|
|
2326
|
+
#[stable(feature = "option_ref_from_ref_option", since = "1.30.0")]
|
|
2327
|
+
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
|
|
2328
|
+
impl<'a, T> const From<&'a Option<T>> for Option<&'a T> {
|
|
2329
|
+
/// Converts from `&Option<T>` to `Option<&T>`.
|
|
2330
|
+
///
|
|
2331
|
+
/// # Examples
|
|
2332
|
+
///
|
|
2333
|
+
/// Converts an <code>[Option]<[String]></code> into an <code>[Option]<[usize]></code>, preserving
|
|
2334
|
+
/// the original. The [`map`] method takes the `self` argument by value, consuming the original,
|
|
2335
|
+
/// so this technique uses `from` to first take an [`Option`] to a reference
|
|
2336
|
+
/// to the value inside the original.
|
|
2337
|
+
///
|
|
2338
|
+
/// [`map`]: Option::map
|
|
2339
|
+
/// [String]: ../../std/string/struct.String.html "String"
|
|
2340
|
+
///
|
|
2341
|
+
/// ```
|
|
2342
|
+
/// let s: Option<String> = Some(String::from("Hello, Rustaceans!"));
|
|
2343
|
+
/// let o: Option<usize> = Option::from(&s).map(|ss: &String| ss.len());
|
|
2344
|
+
///
|
|
2345
|
+
/// println!("Can still print s: {s:?}");
|
|
2346
|
+
///
|
|
2347
|
+
/// assert_eq!(o, Some(18));
|
|
2348
|
+
/// ```
|
|
2349
|
+
fn from(o: &'a Option<T>) -> Option<&'a T> {
|
|
2350
|
+
o.as_ref()
|
|
2351
|
+
}
|
|
2352
|
+
}
|
|
2353
|
+
|
|
2354
|
+
#[stable(feature = "option_ref_from_ref_option", since = "1.30.0")]
|
|
2355
|
+
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
|
|
2356
|
+
impl<'a, T> const From<&'a mut Option<T>> for Option<&'a mut T> {
|
|
2357
|
+
/// Converts from `&mut Option<T>` to `Option<&mut T>`
|
|
2358
|
+
///
|
|
2359
|
+
/// # Examples
|
|
2360
|
+
///
|
|
2361
|
+
/// ```
|
|
2362
|
+
/// let mut s = Some(String::from("Hello"));
|
|
2363
|
+
/// let o: Option<&mut String> = Option::from(&mut s);
|
|
2364
|
+
///
|
|
2365
|
+
/// match o {
|
|
2366
|
+
/// Some(t) => *t = String::from("Hello, Rustaceans!"),
|
|
2367
|
+
/// None => (),
|
|
2368
|
+
/// }
|
|
2369
|
+
///
|
|
2370
|
+
/// assert_eq!(s, Some(String::from("Hello, Rustaceans!")));
|
|
2371
|
+
/// ```
|
|
2372
|
+
fn from(o: &'a mut Option<T>) -> Option<&'a mut T> {
|
|
2373
|
+
o.as_mut()
|
|
2374
|
+
}
|
|
2375
|
+
}
|
|
2376
|
+
|
|
2377
|
+
// Ideally, LLVM should be able to optimize our derive code to this.
|
|
2378
|
+
// Once https://github.com/llvm/llvm-project/issues/52622 is fixed, we can
|
|
2379
|
+
// go back to deriving `PartialEq`.
|
|
2380
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
2381
|
+
impl<T> crate::marker::StructuralPartialEq for Option<T> {}
|
|
2382
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
2383
|
+
#[rustc_const_unstable(feature = "const_cmp", issue = "143800")]
|
|
2384
|
+
impl<T: [const] PartialEq> const PartialEq for Option<T> {
|
|
2385
|
+
#[inline]
|
|
2386
|
+
fn eq(&self, other: &Self) -> bool {
|
|
2387
|
+
// Spelling out the cases explicitly optimizes better than
|
|
2388
|
+
// `_ => false`
|
|
2389
|
+
match (self, other) {
|
|
2390
|
+
(Some(l), Some(r)) => *l == *r,
|
|
2391
|
+
(Some(_), None) => false,
|
|
2392
|
+
(None, Some(_)) => false,
|
|
2393
|
+
(None, None) => true,
|
|
2394
|
+
}
|
|
2395
|
+
}
|
|
2396
|
+
}
|
|
2397
|
+
|
|
2398
|
+
// Manually implementing here somewhat improves codegen for
|
|
2399
|
+
// https://github.com/rust-lang/rust/issues/49892, although still
|
|
2400
|
+
// not optimal.
|
|
2401
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
2402
|
+
#[rustc_const_unstable(feature = "const_cmp", issue = "143800")]
|
|
2403
|
+
impl<T: [const] PartialOrd> const PartialOrd for Option<T> {
|
|
2404
|
+
#[inline]
|
|
2405
|
+
fn partial_cmp(&self, other: &Self) -> Option<cmp::Ordering> {
|
|
2406
|
+
match (self, other) {
|
|
2407
|
+
(Some(l), Some(r)) => l.partial_cmp(r),
|
|
2408
|
+
(Some(_), None) => Some(cmp::Ordering::Greater),
|
|
2409
|
+
(None, Some(_)) => Some(cmp::Ordering::Less),
|
|
2410
|
+
(None, None) => Some(cmp::Ordering::Equal),
|
|
2411
|
+
}
|
|
2412
|
+
}
|
|
2413
|
+
}
|
|
2414
|
+
|
|
2415
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
2416
|
+
#[rustc_const_unstable(feature = "const_cmp", issue = "143800")]
|
|
2417
|
+
impl<T: [const] Ord> const Ord for Option<T> {
|
|
2418
|
+
#[inline]
|
|
2419
|
+
fn cmp(&self, other: &Self) -> cmp::Ordering {
|
|
2420
|
+
match (self, other) {
|
|
2421
|
+
(Some(l), Some(r)) => l.cmp(r),
|
|
2422
|
+
(Some(_), None) => cmp::Ordering::Greater,
|
|
2423
|
+
(None, Some(_)) => cmp::Ordering::Less,
|
|
2424
|
+
(None, None) => cmp::Ordering::Equal,
|
|
2425
|
+
}
|
|
2426
|
+
}
|
|
2427
|
+
}
|
|
2428
|
+
|
|
2429
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
2430
|
+
// The Option Iterators
|
|
2431
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
2432
|
+
|
|
2433
|
+
#[derive(Clone, Debug)]
|
|
2434
|
+
struct Item<A> {
|
|
2435
|
+
opt: Option<A>,
|
|
2436
|
+
}
|
|
2437
|
+
|
|
2438
|
+
impl<A> Iterator for Item<A> {
|
|
2439
|
+
type Item = A;
|
|
2440
|
+
|
|
2441
|
+
#[inline]
|
|
2442
|
+
fn next(&mut self) -> Option<A> {
|
|
2443
|
+
self.opt.take()
|
|
2444
|
+
}
|
|
2445
|
+
|
|
2446
|
+
#[inline]
|
|
2447
|
+
fn size_hint(&self) -> (usize, Option<usize>) {
|
|
2448
|
+
let len = self.len();
|
|
2449
|
+
(len, Some(len))
|
|
2450
|
+
}
|
|
2451
|
+
}
|
|
2452
|
+
|
|
2453
|
+
impl<A> DoubleEndedIterator for Item<A> {
|
|
2454
|
+
#[inline]
|
|
2455
|
+
fn next_back(&mut self) -> Option<A> {
|
|
2456
|
+
self.opt.take()
|
|
2457
|
+
}
|
|
2458
|
+
}
|
|
2459
|
+
|
|
2460
|
+
impl<A> ExactSizeIterator for Item<A> {
|
|
2461
|
+
#[inline]
|
|
2462
|
+
fn len(&self) -> usize {
|
|
2463
|
+
self.opt.len()
|
|
2464
|
+
}
|
|
2465
|
+
}
|
|
2466
|
+
impl<A> FusedIterator for Item<A> {}
|
|
2467
|
+
unsafe impl<A> TrustedLen for Item<A> {}
|
|
2468
|
+
|
|
2469
|
+
/// An iterator over a reference to the [`Some`] variant of an [`Option`].
|
|
2470
|
+
///
|
|
2471
|
+
/// The iterator yields one value if the [`Option`] is a [`Some`], otherwise none.
|
|
2472
|
+
///
|
|
2473
|
+
/// This `struct` is created by the [`Option::iter`] function.
|
|
2474
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
2475
|
+
#[derive(Debug)]
|
|
2476
|
+
pub struct Iter<'a, A: 'a> {
|
|
2477
|
+
inner: Item<&'a A>,
|
|
2478
|
+
}
|
|
2479
|
+
|
|
2480
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
2481
|
+
impl<'a, A> Iterator for Iter<'a, A> {
|
|
2482
|
+
type Item = &'a A;
|
|
2483
|
+
|
|
2484
|
+
#[inline]
|
|
2485
|
+
fn next(&mut self) -> Option<&'a A> {
|
|
2486
|
+
self.inner.next()
|
|
2487
|
+
}
|
|
2488
|
+
#[inline]
|
|
2489
|
+
fn size_hint(&self) -> (usize, Option<usize>) {
|
|
2490
|
+
self.inner.size_hint()
|
|
2491
|
+
}
|
|
2492
|
+
}
|
|
2493
|
+
|
|
2494
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
2495
|
+
impl<'a, A> DoubleEndedIterator for Iter<'a, A> {
|
|
2496
|
+
#[inline]
|
|
2497
|
+
fn next_back(&mut self) -> Option<&'a A> {
|
|
2498
|
+
self.inner.next_back()
|
|
2499
|
+
}
|
|
2500
|
+
}
|
|
2501
|
+
|
|
2502
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
2503
|
+
impl<A> ExactSizeIterator for Iter<'_, A> {}
|
|
2504
|
+
|
|
2505
|
+
#[stable(feature = "fused", since = "1.26.0")]
|
|
2506
|
+
impl<A> FusedIterator for Iter<'_, A> {}
|
|
2507
|
+
|
|
2508
|
+
#[unstable(feature = "trusted_len", issue = "37572")]
|
|
2509
|
+
unsafe impl<A> TrustedLen for Iter<'_, A> {}
|
|
2510
|
+
|
|
2511
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
2512
|
+
impl<A> Clone for Iter<'_, A> {
|
|
2513
|
+
#[inline]
|
|
2514
|
+
fn clone(&self) -> Self {
|
|
2515
|
+
Iter { inner: self.inner.clone() }
|
|
2516
|
+
}
|
|
2517
|
+
}
|
|
2518
|
+
|
|
2519
|
+
/// An iterator over a mutable reference to the [`Some`] variant of an [`Option`].
|
|
2520
|
+
///
|
|
2521
|
+
/// The iterator yields one value if the [`Option`] is a [`Some`], otherwise none.
|
|
2522
|
+
///
|
|
2523
|
+
/// This `struct` is created by the [`Option::iter_mut`] function.
|
|
2524
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
2525
|
+
#[derive(Debug)]
|
|
2526
|
+
pub struct IterMut<'a, A: 'a> {
|
|
2527
|
+
inner: Item<&'a mut A>,
|
|
2528
|
+
}
|
|
2529
|
+
|
|
2530
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
2531
|
+
impl<'a, A> Iterator for IterMut<'a, A> {
|
|
2532
|
+
type Item = &'a mut A;
|
|
2533
|
+
|
|
2534
|
+
#[inline]
|
|
2535
|
+
fn next(&mut self) -> Option<&'a mut A> {
|
|
2536
|
+
self.inner.next()
|
|
2537
|
+
}
|
|
2538
|
+
#[inline]
|
|
2539
|
+
fn size_hint(&self) -> (usize, Option<usize>) {
|
|
2540
|
+
self.inner.size_hint()
|
|
2541
|
+
}
|
|
2542
|
+
}
|
|
2543
|
+
|
|
2544
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
2545
|
+
impl<'a, A> DoubleEndedIterator for IterMut<'a, A> {
|
|
2546
|
+
#[inline]
|
|
2547
|
+
fn next_back(&mut self) -> Option<&'a mut A> {
|
|
2548
|
+
self.inner.next_back()
|
|
2549
|
+
}
|
|
2550
|
+
}
|
|
2551
|
+
|
|
2552
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
2553
|
+
impl<A> ExactSizeIterator for IterMut<'_, A> {}
|
|
2554
|
+
|
|
2555
|
+
#[stable(feature = "fused", since = "1.26.0")]
|
|
2556
|
+
impl<A> FusedIterator for IterMut<'_, A> {}
|
|
2557
|
+
#[unstable(feature = "trusted_len", issue = "37572")]
|
|
2558
|
+
unsafe impl<A> TrustedLen for IterMut<'_, A> {}
|
|
2559
|
+
|
|
2560
|
+
/// An iterator over the value in [`Some`] variant of an [`Option`].
|
|
2561
|
+
///
|
|
2562
|
+
/// The iterator yields one value if the [`Option`] is a [`Some`], otherwise none.
|
|
2563
|
+
///
|
|
2564
|
+
/// This `struct` is created by the [`Option::into_iter`] function.
|
|
2565
|
+
#[derive(Clone, Debug)]
|
|
2566
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
2567
|
+
pub struct IntoIter<A> {
|
|
2568
|
+
inner: Item<A>,
|
|
2569
|
+
}
|
|
2570
|
+
|
|
2571
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
2572
|
+
impl<A> Iterator for IntoIter<A> {
|
|
2573
|
+
type Item = A;
|
|
2574
|
+
|
|
2575
|
+
#[inline]
|
|
2576
|
+
fn next(&mut self) -> Option<A> {
|
|
2577
|
+
self.inner.next()
|
|
2578
|
+
}
|
|
2579
|
+
#[inline]
|
|
2580
|
+
fn size_hint(&self) -> (usize, Option<usize>) {
|
|
2581
|
+
self.inner.size_hint()
|
|
2582
|
+
}
|
|
2583
|
+
}
|
|
2584
|
+
|
|
2585
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
2586
|
+
impl<A> DoubleEndedIterator for IntoIter<A> {
|
|
2587
|
+
#[inline]
|
|
2588
|
+
fn next_back(&mut self) -> Option<A> {
|
|
2589
|
+
self.inner.next_back()
|
|
2590
|
+
}
|
|
2591
|
+
}
|
|
2592
|
+
|
|
2593
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
2594
|
+
impl<A> ExactSizeIterator for IntoIter<A> {}
|
|
2595
|
+
|
|
2596
|
+
#[stable(feature = "fused", since = "1.26.0")]
|
|
2597
|
+
impl<A> FusedIterator for IntoIter<A> {}
|
|
2598
|
+
|
|
2599
|
+
#[unstable(feature = "trusted_len", issue = "37572")]
|
|
2600
|
+
unsafe impl<A> TrustedLen for IntoIter<A> {}
|
|
2601
|
+
|
|
2602
|
+
/// The iterator produced by [`Option::into_flat_iter`]. See its documentation for more.
|
|
2603
|
+
#[derive(Clone, Debug)]
|
|
2604
|
+
#[unstable(feature = "option_into_flat_iter", issue = "148441")]
|
|
2605
|
+
pub struct OptionFlatten<A> {
|
|
2606
|
+
iter: Option<A>,
|
|
2607
|
+
}
|
|
2608
|
+
|
|
2609
|
+
#[unstable(feature = "option_into_flat_iter", issue = "148441")]
|
|
2610
|
+
impl<A: Iterator> Iterator for OptionFlatten<A> {
|
|
2611
|
+
type Item = A::Item;
|
|
2612
|
+
|
|
2613
|
+
fn next(&mut self) -> Option<Self::Item> {
|
|
2614
|
+
self.iter.as_mut()?.next()
|
|
2615
|
+
}
|
|
2616
|
+
|
|
2617
|
+
fn size_hint(&self) -> (usize, Option<usize>) {
|
|
2618
|
+
self.iter.as_ref().map(|i| i.size_hint()).unwrap_or((0, Some(0)))
|
|
2619
|
+
}
|
|
2620
|
+
}
|
|
2621
|
+
|
|
2622
|
+
#[unstable(feature = "option_into_flat_iter", issue = "148441")]
|
|
2623
|
+
impl<A: DoubleEndedIterator> DoubleEndedIterator for OptionFlatten<A> {
|
|
2624
|
+
fn next_back(&mut self) -> Option<Self::Item> {
|
|
2625
|
+
self.iter.as_mut()?.next_back()
|
|
2626
|
+
}
|
|
2627
|
+
}
|
|
2628
|
+
|
|
2629
|
+
#[unstable(feature = "option_into_flat_iter", issue = "148441")]
|
|
2630
|
+
impl<A: ExactSizeIterator> ExactSizeIterator for OptionFlatten<A> {}
|
|
2631
|
+
|
|
2632
|
+
#[unstable(feature = "option_into_flat_iter", issue = "148441")]
|
|
2633
|
+
impl<A: FusedIterator> FusedIterator for OptionFlatten<A> {}
|
|
2634
|
+
|
|
2635
|
+
#[unstable(feature = "option_into_flat_iter", issue = "148441")]
|
|
2636
|
+
unsafe impl<A: TrustedLen> TrustedLen for OptionFlatten<A> {}
|
|
2637
|
+
|
|
2638
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
2639
|
+
// FromIterator
|
|
2640
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
2641
|
+
|
|
2642
|
+
#[stable(feature = "rust1", since = "1.0.0")]
|
|
2643
|
+
impl<A, V: FromIterator<A>> FromIterator<Option<A>> for Option<V> {
|
|
2644
|
+
/// Takes each element in the [`Iterator`]: if it is [`None`][Option::None],
|
|
2645
|
+
/// no further elements are taken, and the [`None`][Option::None] is
|
|
2646
|
+
/// returned. Should no [`None`][Option::None] occur, a container of type
|
|
2647
|
+
/// `V` containing the values of each [`Option`] is returned.
|
|
2648
|
+
///
|
|
2649
|
+
/// # Examples
|
|
2650
|
+
///
|
|
2651
|
+
/// Here is an example which increments every integer in a vector.
|
|
2652
|
+
/// We use the checked variant of `add` that returns `None` when the
|
|
2653
|
+
/// calculation would result in an overflow.
|
|
2654
|
+
///
|
|
2655
|
+
/// ```
|
|
2656
|
+
/// let items = vec![0_u16, 1, 2];
|
|
2657
|
+
///
|
|
2658
|
+
/// let res: Option<Vec<u16>> = items
|
|
2659
|
+
/// .iter()
|
|
2660
|
+
/// .map(|x| x.checked_add(1))
|
|
2661
|
+
/// .collect();
|
|
2662
|
+
///
|
|
2663
|
+
/// assert_eq!(res, Some(vec![1, 2, 3]));
|
|
2664
|
+
/// ```
|
|
2665
|
+
///
|
|
2666
|
+
/// As you can see, this will return the expected, valid items.
|
|
2667
|
+
///
|
|
2668
|
+
/// Here is another example that tries to subtract one from another list
|
|
2669
|
+
/// of integers, this time checking for underflow:
|
|
2670
|
+
///
|
|
2671
|
+
/// ```
|
|
2672
|
+
/// let items = vec![2_u16, 1, 0];
|
|
2673
|
+
///
|
|
2674
|
+
/// let res: Option<Vec<u16>> = items
|
|
2675
|
+
/// .iter()
|
|
2676
|
+
/// .map(|x| x.checked_sub(1))
|
|
2677
|
+
/// .collect();
|
|
2678
|
+
///
|
|
2679
|
+
/// assert_eq!(res, None);
|
|
2680
|
+
/// ```
|
|
2681
|
+
///
|
|
2682
|
+
/// Since the last element is zero, it would underflow. Thus, the resulting
|
|
2683
|
+
/// value is `None`.
|
|
2684
|
+
///
|
|
2685
|
+
/// Here is a variation on the previous example, showing that no
|
|
2686
|
+
/// further elements are taken from `iter` after the first `None`.
|
|
2687
|
+
///
|
|
2688
|
+
/// ```
|
|
2689
|
+
/// let items = vec![3_u16, 2, 1, 10];
|
|
2690
|
+
///
|
|
2691
|
+
/// let mut shared = 0;
|
|
2692
|
+
///
|
|
2693
|
+
/// let res: Option<Vec<u16>> = items
|
|
2694
|
+
/// .iter()
|
|
2695
|
+
/// .map(|x| { shared += x; x.checked_sub(2) })
|
|
2696
|
+
/// .collect();
|
|
2697
|
+
///
|
|
2698
|
+
/// assert_eq!(res, None);
|
|
2699
|
+
/// assert_eq!(shared, 6);
|
|
2700
|
+
/// ```
|
|
2701
|
+
///
|
|
2702
|
+
/// Since the third element caused an underflow, no further elements were taken,
|
|
2703
|
+
/// so the final value of `shared` is 6 (= `3 + 2 + 1`), not 16.
|
|
2704
|
+
#[inline]
|
|
2705
|
+
fn from_iter<I: IntoIterator<Item = Option<A>>>(iter: I) -> Option<V> {
|
|
2706
|
+
// FIXME(#11084): This could be replaced with Iterator::scan when this
|
|
2707
|
+
// performance bug is closed.
|
|
2708
|
+
|
|
2709
|
+
iter::try_process(iter.into_iter(), |i| i.collect())
|
|
2710
|
+
}
|
|
2711
|
+
}
|
|
2712
|
+
|
|
2713
|
+
#[unstable(feature = "try_trait_v2", issue = "84277", old_name = "try_trait")]
|
|
2714
|
+
#[rustc_const_unstable(feature = "const_try", issue = "74935")]
|
|
2715
|
+
impl<T> const ops::Try for Option<T> {
|
|
2716
|
+
type Output = T;
|
|
2717
|
+
type Residual = Option<convert::Infallible>;
|
|
2718
|
+
|
|
2719
|
+
#[inline]
|
|
2720
|
+
fn from_output(output: Self::Output) -> Self {
|
|
2721
|
+
Some(output)
|
|
2722
|
+
}
|
|
2723
|
+
|
|
2724
|
+
#[inline]
|
|
2725
|
+
fn branch(self) -> ControlFlow<Self::Residual, Self::Output> {
|
|
2726
|
+
match self {
|
|
2727
|
+
Some(v) => ControlFlow::Continue(v),
|
|
2728
|
+
None => ControlFlow::Break(None),
|
|
2729
|
+
}
|
|
2730
|
+
}
|
|
2731
|
+
}
|
|
2732
|
+
|
|
2733
|
+
#[unstable(feature = "try_trait_v2", issue = "84277", old_name = "try_trait")]
|
|
2734
|
+
#[rustc_const_unstable(feature = "const_try", issue = "74935")]
|
|
2735
|
+
// Note: manually specifying the residual type instead of using the default to work around
|
|
2736
|
+
// https://github.com/rust-lang/rust/issues/99940
|
|
2737
|
+
impl<T> const ops::FromResidual<Option<convert::Infallible>> for Option<T> {
|
|
2738
|
+
#[inline]
|
|
2739
|
+
fn from_residual(residual: Option<convert::Infallible>) -> Self {
|
|
2740
|
+
match residual {
|
|
2741
|
+
None => None,
|
|
2742
|
+
}
|
|
2743
|
+
}
|
|
2744
|
+
}
|
|
2745
|
+
|
|
2746
|
+
#[diagnostic::do_not_recommend]
|
|
2747
|
+
#[unstable(feature = "try_trait_v2_yeet", issue = "96374")]
|
|
2748
|
+
#[rustc_const_unstable(feature = "const_try", issue = "74935")]
|
|
2749
|
+
impl<T> const ops::FromResidual<ops::Yeet<()>> for Option<T> {
|
|
2750
|
+
#[inline]
|
|
2751
|
+
fn from_residual(ops::Yeet(()): ops::Yeet<()>) -> Self {
|
|
2752
|
+
None
|
|
2753
|
+
}
|
|
2754
|
+
}
|
|
2755
|
+
|
|
2756
|
+
#[unstable(feature = "try_trait_v2_residual", issue = "91285")]
|
|
2757
|
+
#[rustc_const_unstable(feature = "const_try", issue = "74935")]
|
|
2758
|
+
impl<T> const ops::Residual<T> for Option<convert::Infallible> {
|
|
2759
|
+
type TryType = Option<T>;
|
|
2760
|
+
}
|
|
2761
|
+
|
|
2762
|
+
impl<T> Option<Option<T>> {
|
|
2763
|
+
/// Converts from `Option<Option<T>>` to `Option<T>`.
|
|
2764
|
+
///
|
|
2765
|
+
/// # Examples
|
|
2766
|
+
///
|
|
2767
|
+
/// Basic usage:
|
|
2768
|
+
///
|
|
2769
|
+
/// ```
|
|
2770
|
+
/// let x: Option<Option<u32>> = Some(Some(6));
|
|
2771
|
+
/// assert_eq!(Some(6), x.flatten());
|
|
2772
|
+
///
|
|
2773
|
+
/// let x: Option<Option<u32>> = Some(None);
|
|
2774
|
+
/// assert_eq!(None, x.flatten());
|
|
2775
|
+
///
|
|
2776
|
+
/// let x: Option<Option<u32>> = None;
|
|
2777
|
+
/// assert_eq!(None, x.flatten());
|
|
2778
|
+
/// ```
|
|
2779
|
+
///
|
|
2780
|
+
/// Flattening only removes one level of nesting at a time:
|
|
2781
|
+
///
|
|
2782
|
+
/// ```
|
|
2783
|
+
/// let x: Option<Option<Option<u32>>> = Some(Some(Some(6)));
|
|
2784
|
+
/// assert_eq!(Some(Some(6)), x.flatten());
|
|
2785
|
+
/// assert_eq!(Some(6), x.flatten().flatten());
|
|
2786
|
+
/// ```
|
|
2787
|
+
#[inline]
|
|
2788
|
+
#[stable(feature = "option_flattening", since = "1.40.0")]
|
|
2789
|
+
#[rustc_allow_const_fn_unstable(const_precise_live_drops)]
|
|
2790
|
+
#[rustc_const_stable(feature = "const_option", since = "1.83.0")]
|
|
2791
|
+
pub const fn flatten(self) -> Option<T> {
|
|
2792
|
+
// FIXME(const-hack): could be written with `and_then`
|
|
2793
|
+
match self {
|
|
2794
|
+
Some(inner) => inner,
|
|
2795
|
+
None => None,
|
|
2796
|
+
}
|
|
2797
|
+
}
|
|
2798
|
+
}
|
|
2799
|
+
|
|
2800
|
+
impl<T, const N: usize> [Option<T>; N] {
|
|
2801
|
+
/// Transposes a `[Option<T>; N]` into a `Option<[T; N]>`.
|
|
2802
|
+
///
|
|
2803
|
+
/// # Examples
|
|
2804
|
+
///
|
|
2805
|
+
/// ```
|
|
2806
|
+
/// #![feature(option_array_transpose)]
|
|
2807
|
+
/// # use std::option::Option;
|
|
2808
|
+
///
|
|
2809
|
+
/// let data = [Some(0); 1000];
|
|
2810
|
+
/// let data: Option<[u8; 1000]> = data.transpose();
|
|
2811
|
+
/// assert_eq!(data, Some([0; 1000]));
|
|
2812
|
+
///
|
|
2813
|
+
/// let data = [Some(0), None];
|
|
2814
|
+
/// let data: Option<[u8; 2]> = data.transpose();
|
|
2815
|
+
/// assert_eq!(data, None);
|
|
2816
|
+
/// ```
|
|
2817
|
+
#[inline]
|
|
2818
|
+
#[unstable(feature = "option_array_transpose", issue = "130828")]
|
|
2819
|
+
pub fn transpose(self) -> Option<[T; N]> {
|
|
2820
|
+
self.try_map(core::convert::identity)
|
|
2821
|
+
}
|
|
2822
|
+
}
|