Rust: Option should have method `get_or_default`

Created on 13 Oct 2018  路  4Comments  路  Source: rust-lang/rust

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..)

Most helpful comment

@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? :)

All 4 comments

This is already available as Option::unwrap_or_default.

Closing as completed.

@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? :)

Bump, please consider reopening this.

self.get_or_default()

is 20 characters shorter than

self.get_or_insert_with(Default::default)
Was this page helpful?
0 / 5 - 0 ratings