Próbuję wymyślić, jak dopasować a String
w Rust.
Początkowo próbowałem dopasować w ten sposób, ale doszedłem do wniosku, że Rust nie może pośrednio rzucać od std::string::String
do &str
.
fn main() {
let stringthing = String::from("c");
match stringthing {
"a" => println!("0"),
"b" => println!("1"),
"c" => println!("2"),
}
}
Ma to błąd:
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`
Następnie próbowałem skonstruować nowe String
obiekty, ponieważ nie mogłem znaleźć funkcji do rzutowania String
na a &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"),
}
}
To dało mi 3 razy następujący błąd:
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
Jak faktycznie dopasować String
s w Rust?
stringthing.as_str()
jest prawdopodobnie najprostszą ze wszystkich odpowiedzi; Nie podoba mi się,as_ref
ponieważ jest to niepotrzebnie ogólne, co może prowadzić do błędów, i nie jest tak jednoznaczne, nie jest całkowicie jasne, żeas_ref()
będzie&str
,as_str
jest proste i jasne.as_str
jeszcze nie istniała. Zmieniłem przyjętą odpowiedź, ale dziękuję wszystkim, którzy odpowiedzieli na to pytanie!Odpowiedzi:
Możesz zrobić coś takiego:
Istnieje również
as_str
metoda od Rust 1.7.0:źródło
as_slice
jest przestarzałe, powinieneś teraz użyć cechystd::convert::AsRef
:Pamiętaj, że musisz również jawnie obsłużyć sprawę typu catch-all.
źródło
trim()
funkcji. Samo użycieas_ref()
nie pasuje do ciągu.trim()
usunięcia białych znaków . Przydaje się to do deferencowania w celu dopasowania do danych wejściowych użytkownika.Ty też możesz to zrobić
Widzieć:
std::string::String
std::ops::Deref
źródło
Możesz dopasować do wycinka łańcucha.
źródło
.as_ref()
lub.as_str()
oba nie przejęły na własność.Możesz spróbować:
źródło
&*stringthing
oznacza i co robi.