如何在Rust中匹配string文字?

我试图弄清楚如何匹配Rust中的一个string。

我最初尝试这样匹配,但我想通过Rust不能隐式地从std::string::String&str

 fn main() { let stringthing = String::from("c"); match stringthing { "a" => println!("0"), "b" => println!("1"), "c" => println!("2"), } } 

然后我试图构造新的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 

如何在Rust中真正匹配String

as_slice已被弃用,您现在应该使用trait std::convert::AsRef来代替:

 match stringthing.as_ref() { "a" => println!("0"), "b" => println!("1"), "c" => println!("2"), _ => println!("something else!"), } 

请注意,您还必须明确处理全部情况。

这个答案属于老版本的锈,不再准确

你可以匹配一个string片。

 match stringthing.as_slice() { "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!"), } 

从Rust 1.7.0开始,还有一个as_str方法。

你也可以做

 match &stringthing as &str { "a" => println!("0"), "b" => println!("1"), "c" => println!("2"), _ => println!("something else!"), } 

看到:

  • std::string::String
  • std::ops::Deref
  • Deref强制