Skip to content

Commit

Permalink
RFC: Add a replace method to Option
Browse files Browse the repository at this point in the history
  • Loading branch information
Kerollmops committed Jan 21, 2018
1 parent c892139 commit 82657ab
Showing 1 changed file with 48 additions and 0 deletions.
48 changes: 48 additions & 0 deletions text/0000-option-replace.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
- Feature Name: `option-replace`
- Start Date: 2017-01-16
- RFC PR: (leave this empty)
- Rust Issue: (leave this empty)

# Summary
[summary]: #summary

The standard library provides the `Option::take` method that returns the optional inner value and leaves a `None` in place. This RFC proposes the addition of `Option::replace` to complete the previously cited method, this method replaces the actual value in the option by the value given in parameter, returning the old value if present, leaving a `Some` in its place without deinitializing either one.

# Motivation
[motivation]: #motivation

Why are we doing this? What use cases does it support? What is the expected outcome?

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.

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 ?
This is the same kind of method than the `take` one.

# Detailed design
[design]: #detailed-design

This methid will be added to the `core::option::Option` type implementation:

```rust
use core::mem::replace;

pub fn replace(&mut self, value: T) -> Option<T> {
mem::replace(self, Some(value))
}
```

# Drawbacks
[drawbacks]: #drawbacks

It increases the size of the standard library by a tiny bit.

# Alternatives
[alternatives]: #alternatives

- Don't use the `replace` name and use `give` instead in symmetry with the actual `take` method.
- Use directly `mem::replace`.

# Unresolved questions
[unresolved]: #unresolved-questions

None.

0 comments on commit 82657ab

Please sign in to comment.