Atualizado para Rust 1.0
Você não pode obter &'static strde um Stringporque Strings podem não durar toda a vida do seu programa, e é isso que &'staticsignifica vida. Você só pode obter uma fatia parametrizada por seu Stringpróprio tempo de vida.
Para ir de uma Stringfatia para uma fatia, &'a strvocê pode usar a sintaxe de fatia:
let s: String = "abcdefg".to_owned();
let s_slice: &str = &s[..]; // take a full slice of the string
Como alternativa, você pode usar o fato que Stringimplementa Deref<Target=str>e executa um novo empréstimo explícito:
let s_slice: &str = &*s; // s : String
// *s : str (via Deref<Target=str>)
// &*s: &str
Existe ainda outra forma que permite uma sintaxe ainda mais concisa, mas ela só pode ser usada se o compilador for capaz de determinar o tipo de destino desejado (por exemplo, em argumentos de função ou vinculações de variáveis explicitamente digitadas). É chamado de deref coercion e permite usar apenas o &operador, e o compilador irá inserir automaticamente uma quantidade apropriada de *s com base no contexto:
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
Observe que este padrão não é exclusivo para String/ &str- você pode usá-lo com todos os pares de tipos que estão conectados por meio de Deref, por exemplo, com CString/ CStre OsString/ OsStrdo std::ffimódulo ou PathBuf/ Pathdo std::pathmódulo.
'staticO tempo de vida implicaria que a string nunca seria desalocada, ou seja, um vazamento de memória. Por que você precisa em&'static strvez de&'a stralgum apropriado'a?