diff options
| author | Aleksey Kladov <aleksey.kladov@gmail.com> | 2021-04-19 17:48:51 +0300 |
|---|---|---|
| committer | Aleksey Kladov <aleksey.kladov@gmail.com> | 2021-04-19 18:17:45 +0300 |
| commit | de16951dad317a0ce07cf73f7b2202e20f331aa5 (patch) | |
| tree | 807d61ab01f983809011115223a06b4b8ffdb9ea | |
| parent | 62652865b6029b4776a7c03efa13a37b15c9b953 (diff) | |
| download | rust-de16951dad317a0ce07cf73f7b2202e20f331aa5.tar.gz rust-de16951dad317a0ce07cf73f7b2202e20f331aa5.zip | |
Clarify the difference between insert and get_or_insert
| -rw-r--r-- | library/core/src/option.rs | 64 |
1 files changed, 35 insertions, 29 deletions
diff --git a/library/core/src/option.rs b/library/core/src/option.rs index 1e1e9613696..1c68abaf79d 100644 --- a/library/core/src/option.rs +++ b/library/core/src/option.rs @@ -594,34 +594,6 @@ impl<T> Option<T> { } } - /// Inserts `value` into the option then returns a mutable reference to it. - /// - /// If the option already contains a value, the old value is dropped. - /// - /// # Example - /// - /// ``` - /// let mut opt = None; - /// let val = opt.insert(1); - /// assert_eq!(*val, 1); - /// assert_eq!(opt.unwrap(), 1); - /// let val = opt.insert(2); - /// assert_eq!(*val, 2); - /// *val = 3; - /// assert_eq!(opt.unwrap(), 3); - /// ``` - #[inline] - #[stable(feature = "option_insert", since = "1.53.0")] - pub fn insert(&mut self, value: T) -> &mut T { - *self = Some(value); - - match self { - Some(v) => v, - // SAFETY: the code above just filled the option - None => unsafe { hint::unreachable_unchecked() }, - } - } - ///////////////////////////////////////////////////////////////////////// // Iterator constructors ///////////////////////////////////////////////////////////////////////// @@ -849,12 +821,46 @@ impl<T> Option<T> { } ///////////////////////////////////////////////////////////////////////// - // Entry-like operations to insert if None and return a reference + // Entry-like operations to insert a value and return a reference ///////////////////////////////////////////////////////////////////////// + /// Inserts `value` into the option then returns a mutable reference to it. + /// + /// If the option already contains a value, the old value is dropped. + /// + /// See also [`Option::get_or_insert`], which doesn't update the value if + /// the option already contains [`Some`]. + /// + /// # Example + /// + /// ``` + /// let mut opt = None; + /// let val = opt.insert(1); + /// assert_eq!(*val, 1); + /// assert_eq!(opt.unwrap(), 1); + /// let val = opt.insert(2); + /// assert_eq!(*val, 2); + /// *val = 3; + /// assert_eq!(opt.unwrap(), 3); + /// ``` + #[inline] + #[stable(feature = "option_insert", since = "1.53.0")] + pub fn insert(&mut self, value: T) -> &mut T { + *self = Some(value); + + match self { + Some(v) => v, + // SAFETY: the code above just filled the option + None => unsafe { hint::unreachable_unchecked() }, + } + } + /// Inserts `value` into the option if it is [`None`], then /// returns a mutable reference to the contained value. /// + /// See also [`Option::insert`], which updates the value even if + /// the option already contains [`Some`]. + /// /// # Examples /// /// ``` |
