Mis à jour pour Rust 1.0
Vous ne pouvez pas obtenir &'static str
d'un String
car String
s peut ne pas vivre toute la durée de vie de votre programme, et c'est ce que &'static
signifie la vie. Vous ne pouvez paramétrer une tranche que parString
propre durée de vie.
Pour passer d'une String
tranche à une autre, &'a str
vous pouvez utiliser la syntaxe de découpage:
let s: String = "abcdefg".to_owned();
let s_slice: &str = &s[..]; // take a full slice of the string
Alternativement, vous pouvez utiliser le fait qui String
implémente Deref<Target=str>
et effectue un réemprunt explicite:
let s_slice: &str = &*s; // s : String
// *s : str (via Deref<Target=str>)
// &*s: &str
Il existe même une autre méthode qui permet une syntaxe encore plus concise, mais elle ne peut être utilisée que si le compilateur est capable de déterminer le type de cible souhaité (par exemple dans des arguments de fonction ou des liaisons de variables typées explicitement). Elle s'appelle deref coercion et permet d'utiliser uniquement l' &
opérateur, et le compilateur insérera automatiquement une quantité appropriée de *
s en fonction du contexte:
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
Notez que ce modèle n'est pas unique pour String
/ &str
- vous pouvez l'utiliser avec chaque paire de types qui sont connectés Deref
, par exemple, avec CString
/ CStr
et OsString
/ OsStr
depuis le std::ffi
module ou PathBuf
/ Path
depuis le std::path
module.
'static
durée de vie impliquerait que la chaîne ne soit jamais désallouée, c'est-à-dire une fuite de mémoire. Pourquoi avez-vous besoin&'static str
au lieu de&'a str
certains appropriés'a
?