@@ -164,6 +164,30 @@ impl<T> OnceCell<T> {
164
164
}
165
165
}
166
166
167
+ /// Gets the mutable reference of the contents of the cell,
168
+ /// initializing it with `f` if the cell was empty.
169
+ ///
170
+ /// # Panics
171
+ ///
172
+ /// If `f` panics, the panic is propagated to the caller, and the cell
173
+ /// remains uninitialized.
174
+ ///
175
+ /// It is an error to reentrantly initialize the cell from `f`. Doing
176
+ /// so results in a panic.
177
+ ///
178
+ /// # Examples
179
+ ///
180
+ /// ```
181
+ /// use std::cell::OnceCell;
182
+ ///
183
+ /// let mut cell = OnceCell::new();
184
+ /// let value = cell.get_mut_or_init(|| 92);
185
+ /// assert_eq!(value, &92);
186
+ /// *value += 2;
187
+ /// assert_eq!(value, &94);
188
+ /// let value = cell.get_mut_or_init(|| unreachable!());
189
+ /// assert_eq!(value, &94);
190
+ /// ```
167
191
#[ inline]
168
192
#[ stable( feature = "once_cell" , since = "1.70.0" ) ]
169
193
pub fn get_mut_or_init < F > ( & mut self , f : F ) -> & mut T
@@ -214,6 +238,35 @@ impl<T> OnceCell<T> {
214
238
self . try_init ( f)
215
239
}
216
240
241
+ /// Gets the mutable reference of the contents of the cell, initializing
242
+ /// it with `f` if the cell was empty. If the cell was empty and `f` failed,
243
+ /// an error is returned.
244
+ ///
245
+ /// # Panics
246
+ ///
247
+ /// If `f` panics, the panic is propagated to the caller, and the cell
248
+ /// remains uninitialized.
249
+ ///
250
+ /// It is an error to reentrantly initialize the cell from `f`. Doing
251
+ /// so results in a panic.
252
+ ///
253
+ /// # Examples
254
+ ///
255
+ /// ```
256
+ /// #![feature(once_cell_try)]
257
+ ///
258
+ /// use std::cell::OnceCell;
259
+ ///
260
+ /// let mut cell = OnceCell::new();
261
+ /// assert_eq!(cell.get_mut_or_try_init(|| Err(())), Err(()));
262
+ /// assert!(cell.get().is_none());
263
+ /// let value = cell.get_mut_or_try_init(|| -> Result<i32, ()> {
264
+ /// Ok(92)
265
+ /// });
266
+ /// assert_eq!(value, Ok(&mut 92));
267
+ /// *value.unwrap() += 2;
268
+ /// assert_eq!(cell.get(), Some(&94))
269
+ /// ```
217
270
#[ unstable( feature = "once_cell_try" , issue = "109737" ) ]
218
271
pub fn get_mut_or_try_init < F , E > ( & mut self , f : F ) -> Result < & mut T , E >
219
272
where
0 commit comments