Atualizado para Rust 1.0
Você não pode obter &'static str
de um String
porque String
s podem não durar toda a vida do seu programa, e é isso que &'static
significa vida. Você só pode obter uma fatia parametrizada por seu String
próprio tempo de vida.
Para ir de uma String
fatia para uma fatia, &'a str
você 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 String
implementa 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
/ CStr
e OsString
/ OsStr
do std::ffi
módulo ou PathBuf
/ Path
do std::path
módulo.
'static
O tempo de vida implicaria que a string nunca seria desalocada, ou seja, um vazamento de memória. Por que você precisa em&'static str
vez de&'a str
algum apropriado'a
?