# Add \`Option::map\_or\_default\`

**URL:** <https://internals.rust-lang.org/t/add-option-map-or-default/15017>\
**Category:** libs\
**Created:** [July 14, 2021, 11:45am UTC](https://internals.rust-lang.org/t/add-option-map-or-default/15017 "2021-07-14T11:45:44Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![orlp](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/orlp/32/2102_2.png) [@orlp](https://internals.rust-lang.org/u/orlp)\
**Post date:** [July 14, 2021, 11:45am UTC](https://internals.rust-lang.org/t/add-option-map-or-default/15017/1 "2021-07-14T11:45:44Z")

</div>

`Option` has `unwrap`, `unwrap_or`, `unwrap_or_else` and `unwrap_or_default`. It similarly has `map`, `map_or`, `map_or_else` and ~~`map_or_default`~~. Oops, that one is missing. I propose we add it:

```rust
impl<T> Option<T> {
    pub fn map_or_default<U: Default, F: FnOnce(T) -> U>(self, f: F) -> U {
        match self {
            Some(t) => f(t),
            None => Default::default(),
        }
    }
}

```

---

<div class="post-metadata">

**Author:** ![Nokel81](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/nokel81/32/3966_2.png) [@Nokel81](https://internals.rust-lang.org/u/Nokel81)\
**Post date:** [July 14, 2021, 11:49am UTC](https://internals.rust-lang.org/t/add-option-map-or-default/15017/2 "2021-07-14T11:49:23Z")

</div>

For something as small as this I think that just making a PR to add the feature in an unstable form is good enough.

---

<div class="post-metadata">

**Author:** ![orlp](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/orlp/32/2102_2.png) [@orlp](https://internals.rust-lang.org/u/orlp)\
**Post date:** [July 14, 2021, 11:53am UTC](https://internals.rust-lang.org/t/add-option-map-or-default/15017/3 "2021-07-14T11:53:06Z")

</div>

What do you mean by "in an unstable form"?

---

<div class="post-metadata">

**Author:** ![Nokel81](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/nokel81/32/3966_2.png) [@Nokel81](https://internals.rust-lang.org/u/Nokel81)\
**Post date:** [July 14, 2021, 11:57am UTC](https://internals.rust-lang.org/t/add-option-map-or-default/15017/4 "2021-07-14T11:57:27Z")

</div>

I mean that the function is marked as unstable with a tracking issue.

---

<div class="post-metadata">

**Author:** ![steffahn](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/steffahn/32/13288_2.png) [@steffahn](https://internals.rust-lang.org/u/steffahn)\
**Post date:** [July 14, 2021, 12:03pm UTC](https://internals.rust-lang.org/t/add-option-map-or-default/15017/5 "2021-07-14T12:03:58Z")

</div>

With standalone [`default`](https://doc.rust-lang.org/std/default/fn.default.html) (once that’s stabilized) the alternative of writing `.map_or_else(default, |x| { … })` isn’t really more overhead.

---

<div class="post-metadata">

**Author:** ![jdahlstrom](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/jdahlstrom/32/3351_2.png) [@jdahlstrom](https://internals.rust-lang.org/u/jdahlstrom)\
**Post date:** [July 14, 2021, 1:36pm UTC](https://internals.rust-lang.org/t/add-option-map-or-default/15017/6 "2021-07-14T13:36:42Z")

</div>

Indeed I’d say that `unwrap_or_default` will become rather redundant once you can write `unwrap_or(default())` or `unwrap_or_else(default)`.

---

<div class="post-metadata">

**Author:** ![steffahn](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/steffahn/32/13288_2.png) [@steffahn](https://internals.rust-lang.org/u/steffahn)\
**Post date:** [July 14, 2021, 1:53pm UTC](https://internals.rust-lang.org/t/add-option-map-or-default/15017/7 "2021-07-14T13:53:25Z")

</div>

By the way, in case you guys aren’t aware, one can already write `Default::default` as `<_>::default` which is only “slightly” longer that `default`. So `.unwrap_or_else(<_>::default)` or `.map_or_else(<_>::default, |x| { … })`

---

<div class="post-metadata">

**Author:** ![orlp](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/orlp/32/2102_2.png) [@orlp](https://internals.rust-lang.org/u/orlp)\
**Post date:** [July 14, 2021, 2:53pm UTC](https://internals.rust-lang.org/t/add-option-map-or-default/15017/8 "2021-07-14T14:53:42Z")

</div>

Feel free to voice any concerns (or support) you have in the RFC pull request I posted: [RFC: map\_or\_default in Option and Result by orlp · Pull Request #3148 · rust-lang/rfcs · GitHub](https://github.com/rust-lang/rfcs/pull/3148).

---

<div class="post-metadata">

**Author:** ![system](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/system/32/14092_2.png) [@system](https://internals.rust-lang.org/u/system)\
**Post date:** [October 12, 2021, 2:53pm UTC](https://internals.rust-lang.org/t/add-option-map-or-default/15017/9 "2021-10-12T14:53:46Z")

</div>

Closed on October 12, 2021, 2:53pm UTC

This topic was automatically closed 90 days after the last reply. New replies are no longer allowed.
