Как сопоставить строку со строковыми литералами в Rust?
Я пытаюсь выяснить, как, чтобы соответствовать String
в Русте.
Я изначально пытался сопоставить это, но я понял, что ржавчина не может неявно отбрасываться от std::string::String
до &str
.
fn main() {
let stringthing = String::from("c");
match stringthing {
"a" => println!("0"),
"b" => println!("1"),
"c" => println!("2"),
}
}
это сообщение об ошибке:
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`
затем я попытался построить новый String
объекты, так как я не мог найти функцию для приведения String
до &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"),
}
}
это дало мне следующую ошибку 3 раза:
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
как чтобы на самом деле соответствовать String
ы в раст?
4 ответа:
as_slice
является устаревшим, теперь вы должны использовать признакstd::convert::AsRef
вместо:match stringthing.as_ref() { "a" => println!("0"), "b" => println!("1"), "c" => println!("2"), _ => println!("something else!"), }
обратите внимание, что вы также должны явно обрабатывать все случаи.
вы также можете сделать
match &stringthing as &str { "a" => println!("0"), "b" => println!("1"), "c" => println!("2"), _ => println!("something else!"), }
посмотреть:
вы можете сделать что-то вроде этого:
match &stringthing[..] { "a" => println!("0"), "b" => println!("1"), "c" => println!("2"), _ => println!("something else!"), }
есть еще
as_str
метод от ржавчины 1.7.0:match stringthing.as_str() { "a" => println!("0"), "b" => println!("1"), "c" => println!("2"), _ => println!("something else!"), }