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.

use std::borrow::Cow;

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

// 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);

And the error is:

error[E0515]: cannot return value referencing function parameter `s`
 --> examples/
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 {

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.


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

Thanks very much for giving me the correct version.

Thank you for all your rapid replies!