diff --git a/library/core/src/result.rs b/library/core/src/result.rs index a43ba5882edcd..d8747f8b8d6dc 100644 --- a/library/core/src/result.rs +++ b/library/core/src/result.rs @@ -1276,6 +1276,41 @@ impl Result, E> { } } +impl Result { + /// Returns the [`Ok`] value if `self` is `Ok`, and the [`Err`] value if + /// `self` is `Err`. + /// + /// In other words, this function returns the value (the `T`) of a + /// `Result`, regardless of whether or not that result is `Ok` or + /// `Err`. + /// + /// This can be useful in conjunction with APIs such as + /// [`Atomic*::compare_exchange`], or [`slice::binary_search`][binary_search], but only in + /// cases where you don't care if the result was `Ok` or not. + /// + /// [`Atomic*::compare_exchange`]: crate::sync::atomic::AtomicBool::compare_exchange + /// [binary_search]: ../../std/primitive.slice.html#method.binary_search + /// + /// # Examples + /// + /// ``` + /// #![feature(result_into_ok_or_err)] + /// let ok: Result = Ok(3); + /// let err: Result = Err(4); + /// + /// assert_eq!(ok.into_ok_or_err(), 3); + /// assert_eq!(err.into_ok_or_err(), 4); + /// ``` + #[inline] + #[unstable(feature = "result_into_ok_or_err", reason = "newly added", issue = "82223")] + pub const fn into_ok_or_err(self) -> T { + match self { + Ok(v) => v, + Err(v) => v, + } + } +} + // This is a separate function to reduce the code size of the methods #[inline(never)] #[cold] diff --git a/library/core/tests/lib.rs b/library/core/tests/lib.rs index 40dc6473b7d40..34e05760db259 100644 --- a/library/core/tests/lib.rs +++ b/library/core/tests/lib.rs @@ -65,6 +65,7 @@ #![feature(never_type)] #![feature(unwrap_infallible)] #![feature(option_result_unwrap_unchecked)] +#![feature(result_into_ok_or_err)] #![feature(option_unwrap_none)] #![feature(peekable_peek_mut)] #![feature(once_cell)] diff --git a/library/core/tests/result.rs b/library/core/tests/result.rs index 7aa44c6e593b3..5fcd7b4d3a327 100644 --- a/library/core/tests/result.rs +++ b/library/core/tests/result.rs @@ -95,6 +95,15 @@ fn test_unwrap_or() { assert_eq!(ok_err.unwrap_or(50), 50); } +#[test] +fn test_ok_or_err() { + let ok: Result = Ok(100); + let err: Result = Err(200); + + assert_eq!(ok.into_ok_or_err(), 100); + assert_eq!(err.into_ok_or_err(), 200); +} + #[test] fn test_unwrap_or_else() { fn handler(msg: &'static str) -> isize {