J'essaie de comprendre comment faire correspondre un String
dans Rust.
J'ai d'abord essayé d'apparier comme ceci, mais j'ai compris Rust ne peut pas implicitement transtyper de std::string::String
à &str
.
fn main() {
let stringthing = String::from("c");
match stringthing {
"a" => println!("0"),
"b" => println!("1"),
"c" => println!("2"),
}
}
Cela a l'erreur:
error[E0308]: mismatched types
--> src/main.rs:4:9
|
4 | "a" => println!("0"),
| ^^^ expected struct `std::string::String`, found reference
|
= note: expected type `std::string::String`
found type `&'static str`
J'ai ensuite essayé de construire de nouveaux objets String
, car je ne trouvais pas de fonction permettant de convertir un String
en un &str
.
fn main() {
let stringthing = String::from("c");
match stringthing {
String::from("a") => println!("0"),
String::from("b") => println!("1"),
String::from("c") => println!("2"),
}
}
Cela m'a donné l'erreur suivante 3 fois:
error[E0164]: `String::from` does not name a Tuple variant or a Tuple struct
--> src/main.rs:4:9
|
4 | String::from("a") => return 0,
| ^^^^^^^^^^^^^^^^^ not a Tuple variant or struct
Comment associer réellement String
s à Rust?
as_slice
est obsolète, vous devriez maintenant utiliser le trait std::convert::AsRef
au lieu:
match stringthing.as_ref() {
"a" => println!("0"),
"b" => println!("1"),
"c" => println!("2"),
_ => println!("something else!"),
}
Notez que vous devez également gérer explicitement le cas fourre-tout.
Vous pouvez faire quelque chose comme ça:
match &stringthing[..] {
"a" => println!("0"),
"b" => println!("1"),
"c" => println!("2"),
_ => println!("something else!"),
}
Il y a aussi un as_str
méthode à partir de Rust 1.7.0:
match stringthing.as_str() {
"a" => println!("0"),
"b" => println!("1"),
"c" => println!("2"),
_ => println!("something else!"),
}
Tu pourrais aussi faire
match &stringthing as &str {
"a" => println!("0"),
"b" => println!("1"),
"c" => println!("2"),
_ => println!("something else!"),
}
Voir:
Note de l'éditeur: Cette réponse concerne une version de Rust avant 1.0 et ne fonctionne pas dans Rust 1.0
Vous pouvez faire correspondre une tranche de chaîne.
match stringthing.as_slice() {
"a" => println!("0"),
"b" => println!("1"),
"c" => println!("2"),
_ => println!("something else!"),
}