Skip to content

Option should have method get_or_default #55042

@Boscop

Description

@Boscop

There is some symmetry between the methods of HashMap's Entry and Option, e.g.
https://doc.rust-lang.org/nightly/std/collections/hash_map/enum.Entry.html#method.or_insert
https://doc.rust-lang.org/nightly/std/option/enum.Option.html#method.get_or_insert

https://doc.rust-lang.org/nightly/std/collections/hash_map/enum.Entry.html#method.or_insert_with
https://doc.rust-lang.org/nightly/std/option/enum.Option.html#method.get_or_insert_with

But the analogue of Entry's or_default is missing from Option:
Option should have a method get_or_default, that does conceptually the same as or_default by doing self.get_or_insert_with(|| Default::default()) (returns &mut T).

(This use case occurs often in some projects of mine..)

Activity

clarfonthey

clarfonthey commented on Oct 13, 2018

@clarfonthey
Contributor

This is already available as Option::unwrap_or_default.

Centril

Centril commented on Oct 13, 2018

@Centril
Contributor

Closing as completed.

Boscop

Boscop commented on Oct 14, 2018

@Boscop
Author

@clarcharr It's not the same because it consumes the Option instead of mutating it.
One can do opt = Some(opt.unwrap_or_default()); but then one doesn't have a &mut T to work with, that refers to the Some(..)-content of the Option!
In the use-cases where I needed this, I need to have the &mut T from that point on, just like with Entry's or_default. (In other cases, yes, I use unwrap_or_default.)
So I think it's still worth adding the get_or_default method that returns a &mut T to the contents of the Option.
(In fact, I need this behavior more often with Option than with HashMap's Entry.)
@Centril Can we please re-open this issue? :)

CasperN

CasperN commented on Aug 5, 2020

@CasperN

Bump, please consider reopening this.

self.get_or_default()

is 20 characters shorter than

self.get_or_insert_with(Default::default)
added 2 commits that reference this issue on Mar 9, 2021
added a commit that references this issue on Mar 9, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @Boscop@Centril@CasperN@clarfonthey

        Issue actions

          Option should have method `get_or_default` · Issue #55042 · rust-lang/rust