|
| 1 | +- Feature Name: `option-replace` |
| 2 | +- Start Date: 2017-01-16 |
| 3 | +- RFC PR: [rust-lang/rfcs#2296](https://github.com/rust-lang/rfcs/pull/2296) |
| 4 | +- Rust Issue: [rust-lang/rust#51998](https://github.com/rust-lang/rust/issues/51998) |
| 5 | + |
| 6 | +# Summary |
| 7 | +[summary]: #summary |
| 8 | + |
| 9 | +This RFC proposes the addition of `Option::replace` to complete the `Option::take` method, it replaces the actual value in the option by `Some` with the value given in parameter, returning the old value if present, without deinitializing either one. |
| 10 | + |
| 11 | +# Motivation |
| 12 | +[motivation]: #motivation |
| 13 | + |
| 14 | +You can see the `Option` as a container and other containers already have this kind of method to change a value in-place like the [HashMap::replace](https://doc.rust-lang.org/std/collections/struct.HashSet.html#method.replace) method. |
| 15 | + |
| 16 | +How do you replace a value inside an `Option`, you can use `mem::replace` but it can be really unconvenient to import the `mem` module just for that. Why not adding a useful method to do that ? |
| 17 | + |
| 18 | +This is the symmetry of the already present `Option::take` method. |
| 19 | + |
| 20 | +# Detailed design |
| 21 | +[design]: #detailed-design |
| 22 | + |
| 23 | +This method will be added to the `core::option::Option` type implementation: |
| 24 | + |
| 25 | +```rust |
| 26 | +use core::mem::replace; |
| 27 | + |
| 28 | +impl<T> Option<T> { |
| 29 | + // ... |
| 30 | + |
| 31 | + pub fn replace(&mut self, value: T) -> Option<T> { |
| 32 | + mem::replace(self, Some(value)) |
| 33 | + } |
| 34 | +} |
| 35 | +``` |
| 36 | + |
| 37 | +# Drawbacks |
| 38 | +[drawbacks]: #drawbacks |
| 39 | + |
| 40 | +It increases the size of the standard library by a tiny bit. |
| 41 | + |
| 42 | +The add of this method could be a breaking change in the case of an already implemented method on the `Option` enum with the `replace` name. (i.e. a Trait defining the `replace` method that has been implemented on the `Option` type). |
| 43 | + |
| 44 | +This method behavior could be misinterpreted: Updating the `Option` only if the variant is `Some`, doing nothing if its `None`. This other method could exist too and be named `map_in_place` or `modify`, no method having this kind of behavior already exist in the Rust std library. |
| 45 | + |
| 46 | +# Alternatives |
| 47 | +[alternatives]: #alternatives |
| 48 | + |
| 49 | +- Don't use the `replace` name and use `give` instead in symmetry with the actual `take` method. |
| 50 | +- Use directly `mem::replace`. |
| 51 | + |
| 52 | +# Unresolved questions |
| 53 | +[unresolved]: #unresolved-questions |
| 54 | + |
| 55 | +None. |
0 commit comments