How to convert a String into a &'static str

rust

Solution

Updated for Rust 1.0

You cannot obtain `&'static str` from a `String` because `String`s may not live for the entire life of your program, and that's what `&'static` lifetime means. You can only get a slice parameterized by `String` own lifetime from it.

To go from a `String` to a slice `&'a str` you can use slicing syntax:

let s: String = "abcdefg".to_owned();
let s_slice: &str = &s[..];  // take a full slice of the string

Alternatively, you can use the fact that `String` implements `Deref<Target=str>` and perform an explicit reborrowing:

let s_slice: &str = &*s;  // s  : String 
                          // *s : str (via Deref<Target=str>)
                          // &*s: &str

There is even another way which allows for even more concise syntax but it can only be used if the compiler is able to determine the desired target type (e.g. in function arguments or explicitly typed variable bindings). It is called deref coercion and it allows using just `&` operator, and the compiler will automatically insert an appropriate amount of `*`s based on the context:

let s_slice: &str = &s;  // okay

fn take_name(name: &str) { ... }
take_name(&s);           // okay as well

let not_correct = &s;    // this will give &String, not &str,
                         // because the compiler does not know
                         // that you want a &str

Note that this pattern is not unique for `String`/`&str` - you can use it with every pair of types which are connected through `Deref`, for example, with `CString`/`CStr` and `OsString`/`OsStr` from `std::ffi` module or `PathBuf`/`Path` from `std::path` module.

Problem

How do I convert a `String` into a `&str`? More specifically, I would like to convert it into a `str` with the `static` lifetime (`&'static str`).

Original source

Related problems