Ich versuche herauszufinden, wie man einen String
in Rust zusammenbringt.
Ich habe anfangs versucht, so zu passen, aber ich habe herausgefunden, dass Rust nicht implizit von std::string::String
bis werfen kann &str
.
fn main() {
let stringthing = String::from("c");
match stringthing {
"a" => println!("0"),
"b" => println!("1"),
"c" => println!("2"),
}
}
Dies hat den Fehler:
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`
Ich habe dann versucht , neu zu konstruieren String
Objekte, da ich keine Funktion werfen einen finden konnte String
zu ein &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"),
}
}
Dies gab mir dreimal den folgenden Fehler:
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
Wie passt man eigentlich zu String
s in Rust?
stringthing.as_str()
ist wahrscheinlich die einfachste aller Antworten; Ich mag es nicht,as_ref
weil es unnötig allgemein ist, was zu Fehlern führen kann, und nicht so explizit, es ist nicht ganz klar, dassas_ref()
es ein sein wird&str
,as_str
ist einfach und klar.as_str
noch nicht existierte. Ich habe die akzeptierte Antwort geändert, aber ich danke allen, die diese Frage beantwortet haben!Antworten:
Sie können so etwas tun:
as_str
Ab Rust 1.7.0 gibt es auch eine Methode:quelle
as_slice
veraltet ist, sollten Sie jetztstd::convert::AsRef
stattdessen das Merkmal verwenden:Beachten Sie, dass Sie auch den Sammelfall explizit behandeln müssen.
quelle
trim()
Funktion nutzen. Nur die Verwendungas_ref()
stimmt nicht mit der Zeichenfolge überein.trim()
entfernt werden. Dies ist gut geeignet, um die Deferenzierung mit Benutzereingaben abzugleichen.Sie könnten auch tun
Sehen:
std::string::String
std::ops::Deref
quelle
Sie können auf einem String-Slice übereinstimmen.
quelle
.as_ref()
oder.as_str()
beide nicht übernommen.Du kannst es versuchen:
quelle
&*stringthing
bedeutet und tut.