summaryrefslogtreecommitdiffstats
path: root/library/core/src/option.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-30 03:59:35 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-30 03:59:35 +0000
commitd1b2d29528b7794b41e66fc2136e395a02f8529b (patch)
treea4a17504b260206dec3cf55b2dca82929a348ac2 /library/core/src/option.rs
parentReleasing progress-linux version 1.72.1+dfsg1-1~progress7.99u1. (diff)
downloadrustc-d1b2d29528b7794b41e66fc2136e395a02f8529b.tar.xz
rustc-d1b2d29528b7794b41e66fc2136e395a02f8529b.zip
Merging upstream version 1.73.0+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'library/core/src/option.rs')
-rw-r--r--library/core/src/option.rs36
1 files changed, 36 insertions, 0 deletions
diff --git a/library/core/src/option.rs b/library/core/src/option.rs
index 9b6ff76b2..becb63309 100644
--- a/library/core/src/option.rs
+++ b/library/core/src/option.rs
@@ -1125,6 +1125,7 @@ impl<T> Option<T> {
/// ```
#[inline]
#[stable(feature = "rust1", since = "1.0.0")]
+ #[must_use = "if you don't need the returned value, use `if let` instead"]
pub fn map_or<U, F>(self, default: U, f: F) -> U
where
F: FnOnce(T) -> U,
@@ -1697,6 +1698,41 @@ impl<T> Option<T> {
mem::replace(self, None)
}
+ /// Takes the value out of the option, but only if the predicate evaluates to
+ /// `true` on a mutable reference to the value.
+ ///
+ /// In other words, replaces `self` with `None` if the predicate returns `true`.
+ /// This method operates similar to [`Option::take`] but conditional.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// #![feature(option_take_if)]
+ ///
+ /// let mut x = Some(42);
+ ///
+ /// let prev = x.take_if(|v| if *v == 42 {
+ /// *v += 1;
+ /// false
+ /// } else {
+ /// false
+ /// });
+ /// assert_eq!(x, Some(43));
+ /// assert_eq!(prev, None);
+ ///
+ /// let prev = x.take_if(|v| *v == 43);
+ /// assert_eq!(x, None);
+ /// assert_eq!(prev, Some(43));
+ /// ```
+ #[inline]
+ #[unstable(feature = "option_take_if", issue = "98934")]
+ pub fn take_if<P>(&mut self, predicate: P) -> Option<T>
+ where
+ P: FnOnce(&mut T) -> bool,
+ {
+ if self.as_mut().map_or(false, predicate) { self.take() } else { None }
+ }
+
/// Replaces the actual value in the option by the value given in parameter,
/// returning the old value if present,
/// leaving a [`Some`] in its place without deinitializing either one.