Comment convertir une Ssortingng
en un &str
? Plus précisément, je souhaiterais le convertir en str
avec la durée de vie static
( &'static str
).
Mise à jour pour Rust 1.0
Vous ne pouvez pas obtenir &'static str
d’une Ssortingng
car les Ssortingng
ne vivent pas pendant toute la durée de vie de votre programme, et c’est ce que signifie la &'static
durée de vie &'static
. Vous ne pouvez obtenir une tranche paramétrée que par sa propre durée de vie.
Pour passer d’une Ssortingng
à une tranche &'a str
vous pouvez utiliser la syntaxe de découpage:
let s: Ssortingng = "abcdefg".to_owned(); let s_slice: &str = &s[..]; // take a full slice of the ssortingng
Alternativement, vous pouvez utiliser le fait que Ssortingng
implémente Deref
et effectue un réenregistrement explicite:
let s_slice: &str = &*s; // s : Ssortingng // *s : str (via Deref) // &*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 explicitement typées). Il s’appelle deref coercion et permet d’utiliser just &
operator, 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 &Ssortingng, not &str, // because the comstackr does not know // that you want a &str
Notez que ce modèle n’est pas unique pour Ssortingng
/ &str
– vous pouvez l’utiliser avec chaque paire de types connectés via Deref
, par exemple avec CSsortingng
/ CStr
et OsSsortingng
/ OsStr
partir du module std::ffi
ou PathBuf
/ Path
partir de std::path
module de std::path
Vous pouvez le faire, mais cela implique de perdre la mémoire de la Ssortingng
. Ce n’est pas quelque chose que vous devriez faire à la légère. En divulguant la mémoire de la Ssortingng
, nous garantissons que la mémoire ne sera jamais libérée (donc la fuite). Par conséquent, toute référence à l’object interne peut être interprétée comme ayant la 'static
durée de vie 'static
.
use std::mem; fn ssortingng_to_static_str(s: Ssortingng) -> &'static str { unsafe { let ret = mem::transmute(&s as &str); mem::forget(s); ret } } fn main() { let mut s = Ssortingng::new(); std::io::stdin().read_line(&mut s).unwrap(); let s: &'static str = ssortingng_to_static_str(s); }