J'essaie de trouver un moyen de faire correspondre un String
dans Rust.
J'ai d'abord essayé de faire des correspondances comme celle-ci, mais j'ai compris que Rust ne pouvait pas implicitement être casté 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 String
objets, car je ne pouvais pas trouver de fonction pour 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 faire correspondre les String
s à Rust?
stringthing.as_str()
est probablement la plus simple de toutes les réponses; Je n'aime pasas_ref
parce que c'est inutilement général, ce qui peut conduire à des bugs, et pas aussi explicite, ce n'est pas tout à fait clair que çaas_ref()
va être&str
,as_str
c'est simple et clair.as_str
n'existait pas encore. J'ai changé la réponse acceptée mais merci à toutes les personnes qui ont répondu à cette question!Réponses:
Vous pouvez faire quelque chose comme ça:
Il existe également une
as_str
méthode à partir de Rust 1.7.0:la source
as_slice
est obsolète, vous devez maintenant utiliser le trait à lastd::convert::AsRef
place:Notez que vous devez également gérer explicitement le cas fourre-tout.
la source
trim()
fonction. Le simple fait d'utiliseras_ref()
ne correspond pas à la chaîne.trim()
suppression des espaces . C'est bien pour que la comparaison soit mise en correspondance avec l'entrée utilisateur.Vous pourriez aussi faire
Voir:
std::string::String
std::ops::Deref
la source
Vous pouvez faire correspondre sur une tranche de chaîne.
la source
.as_ref()
ou.as_str()
, les deux n'ont pas pris possession.Tu peux essayer:
la source
&*stringthing
signifie et fait.