Skip to content

Commit 20176fe

Browse files
Rollup merge of rust-lang#52003 - Kerollmops:option-replace, r=Kimundi
Implement `Option::replace` in the core library Here is the implementation of the `Option::replace` method. The first step of [the tracking issue rust-lang#51998](rust-lang#51998).
2 parents 030d60c + c8f0e6f commit 20176fe

File tree

3 files changed

+43
-0
lines changed

3 files changed

+43
-0
lines changed

src/libcore/option.rs

+27
Original file line numberDiff line numberDiff line change
@@ -845,6 +845,33 @@ impl<T> Option<T> {
845845
pub fn take(&mut self) -> Option<T> {
846846
mem::replace(self, None)
847847
}
848+
849+
/// Replaces the actual value in the option by the value given in parameter,
850+
/// returning the old value if present,
851+
/// leaving a [`Some`] in its place without deinitializing either one.
852+
///
853+
/// [`Some`]: #variant.Some
854+
///
855+
/// # Examples
856+
///
857+
/// ```
858+
/// #![feature(option_replace)]
859+
///
860+
/// let mut x = Some(2);
861+
/// let old = x.replace(5);
862+
/// assert_eq!(x, Some(5));
863+
/// assert_eq!(old, Some(2));
864+
///
865+
/// let mut x = None;
866+
/// let old = x.replace(3);
867+
/// assert_eq!(x, Some(3));
868+
/// assert_eq!(old, None);
869+
/// ```
870+
#[inline]
871+
#[unstable(feature = "option_replace", issue = "51998")]
872+
pub fn replace(&mut self, value: T) -> Option<T> {
873+
mem::replace(self, Some(value))
874+
}
848875
}
849876

850877
impl<'a, T: Clone> Option<&'a T> {

src/libcore/tests/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
#![feature(reverse_bits)]
4545
#![feature(iterator_find_map)]
4646
#![feature(slice_internals)]
47+
#![feature(option_replace)]
4748

4849
extern crate core;
4950
extern crate test;

src/libcore/tests/option.rs

+15
Original file line numberDiff line numberDiff line change
@@ -297,3 +297,18 @@ fn test_try() {
297297
}
298298
assert_eq!(try_option_err(), Err(NoneError));
299299
}
300+
301+
#[test]
302+
fn test_replace() {
303+
let mut x = Some(2);
304+
let old = x.replace(5);
305+
306+
assert_eq!(x, Some(5));
307+
assert_eq!(old, Some(2));
308+
309+
let mut x = None;
310+
let old = x.replace(3);
311+
312+
assert_eq!(x, Some(3));
313+
assert_eq!(old, None);
314+
}

0 commit comments

Comments
 (0)