How do I get a &str or String from std::borrow::Cow<str>?

Viewed 17476

I have a Cow:

use std::borrow::Cow;  // Cow = clone on write
let example = Cow::from("def")

I would like to get the def back out of it, in order to append it to another String:

let mut alphabet: String = "ab".to_string();
alphabet.push_str("c");
// here I would like to do:
alphabet.push_str(example);

This does not work and I don't see the appropriate method in Cow to get the &str or String back out.

2 Answers

How do I get a &str

  1. Use Borrow:

    use std::borrow::Borrow;
    alphabet.push_str(example.borrow());
    
  2. Use AsRef:

    alphabet.push_str(example.as_ref());
    
  3. Use Deref explicitly:

    use std::ops::Deref;
    alphabet.push_str(example.deref());
    
  4. Use Deref implicitly through a coercion:

    alphabet.push_str(&example);
    

How do I get a String

  1. Use ToString:

    example.to_string();
    
  2. Use Cow::into_owned:

    example.into_owned();
    
  3. Use any method to get a reference and then call to_owned:

    example.as_ref().to_owned();
    

Pass a reference to example (i.e. &example) to push_str.

let mut alphabet: String = "ab".to_string();
alphabet.push_str("c");  
alphabet.push_str(&example);

This works because Cow implements Deref.

Related