Is there any way to convert Cow<'_, str> to &str

Hi, thanks for your patient.
I encountered an problem when converting Cow<'_, str> to &str.
code:

use std::borrow::Cow;

pub fn convert(s: Cow<'_, str>) -> &str {
    s.as_ref()
}

// lifetime un-elided version, same result.
// pub fn convert<'a>(s: Cow<'a, str>) -> &'a str {
//    s.as_ref()
// }

fn main() {
    let s = Cow::from("hello");
    let s2 = convert(s);
    dbg!(s2);
}

And the error is:

error[E0515]: cannot return value referencing function parameter `s`
 --> examples/convert_ref.rs:6:5
  |
6 |     s.as_ref()
  |     -^^^^^^^^^
  |     |
  |     returns a value referencing data owned by the current function
  |     `s` is borrowed here

Isn't s in lifetime 'a? Or converting Cow<'_, str> to &str is a wrong doing?

This is because if the Cow contains an owned string, that owned string is destroyed when you exit the function.

1 Like
fn convert<'a>(s: &'a Cow<'_, str>) -> &'a str {
    s.as_ref()
}

That would be the function you'd want, but I have a hard time figuring a use case for it. Cow itself needs to outlive the function's scope, else what it holds (be it an owned type or a reference) will be dropped.

2 Likes

@alice
Thanks very much for clear my mind on why it failed!

@jRimbault
Thanks very much for giving me the correct version.

Thank you for all your rapid replies!