# Pre-RFC: Option\<String\> to Option\<&str\> \[solved\]

**URL:** <https://internals.rust-lang.org/t/pre-rfc-option-string-to-option-str-solved/9620>\
**Category:** libs\
**Created:** [March 15, 2019, 3:55pm UTC](https://internals.rust-lang.org/t/pre-rfc-option-string-to-option-str-solved/9620 "2019-03-15T15:55:17Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![kornel](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/kornel/32/2711_2.png) [@kornel](https://internals.rust-lang.org/u/kornel)\
**Post date:** [March 15, 2019, 3:55pm UTC](https://internals.rust-lang.org/t/pre-rfc-option-string-to-option-str-solved/9620/1 "2019-03-15T15:55:17Z")

</div>

I find that I need to convert `Option<String>` to `Option<&str>` quite often. Simple `option.as_ref()` is not sufficient, because it gives `Option<&String>` which doesn't automagically deref.

The code for this is not terrible, but relatively long for an operation that seems basic: `option.as_ref().map(|s| s.as_str())`.

~~Could there be a better method for this? What would it be?~~

OK, there's `Option::as_deref()`

---

<div class="post-metadata">

**Author:** ![kornel](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/kornel/32/2711_2.png) [@kornel](https://internals.rust-lang.org/u/kornel)\
**Post date:** [March 15, 2019, 3:58pm UTC](https://internals.rust-lang.org/t/pre-rfc-option-string-to-option-str-solved/9620/2 "2019-03-15T15:58:40Z")

</div>

The most straightforward solution could be adding `option.as_str()` for `Option<String>`. I wouldn’t mind that, but it’s not generic (e.g. `Option<Vec<T>>` to `Option<[T]>` is left out).

However, I worry that more generic solutions would end up being blocked by either lack of specialization, or an overly generic `as_ref()` could risk breaking crates due to adding more ambiguity to type inference.

---

<div class="post-metadata">

**Author:** ![jethrogb](https://avatars.discourse-cdn.com/v4/letter/j/43a26b/32.png) [@jethrogb](https://internals.rust-lang.org/u/jethrogb)\
**Post date:** [March 15, 2019, 4:06pm UTC](https://internals.rust-lang.org/t/pre-rfc-option-string-to-option-str-solved/9620/3 "2019-03-15T16:06:53Z")

</div>

I too have needed this many times.

> [@kornel](#):
>
> The code for this is not terrible, but relatively long for an operation that seems basic: `option.as_ref().map(|s| s.as_str())` .

I think generally, you're looking for a shorthand for:

```rust
option.as_ref().map(Deref::deref)

```

And maybe also:

```rust
option.as_mut().map(DerefMut::deref_mut)

```

Bikeshed: as\_deref, as\_deref\_mut?

---

<div class="post-metadata">

**Author:** ![taiki-e](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/taiki-e/32/5017_2.png) [@taiki-e](https://internals.rust-lang.org/u/taiki-e)\
**Post date:** [March 15, 2019, 4:32pm UTC](https://internals.rust-lang.org/t/pre-rfc-option-string-to-option-str-solved/9620/4 "2019-03-15T16:32:41Z")

</div>

> <https://github.com/rust-lang/rust/issues/50264>

---

<div class="post-metadata">

**Author:** ![H2CO3](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/h2co3/32/2849_2.png) [@H2CO3](https://internals.rust-lang.org/u/H2CO3)\
**Post date:** [March 15, 2019, 5:58pm UTC](https://internals.rust-lang.org/t/pre-rfc-option-string-to-option-str-solved/9620/5 "2019-03-15T17:58:36Z")

</div>

To add to that, here is the [relevant documentation](https://doc.rust-lang.org/std/option/enum.Option.html#method.as_deref).

---

<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:** [June 13, 2019, 5:58pm UTC](https://internals.rust-lang.org/t/pre-rfc-option-string-to-option-str-solved/9620/6 "2019-06-13T17:58:41Z")

</div>

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