String 如何将字符串与字符串文字相匹配?
我试图找出如何匹配Rust中的String 如何将字符串与字符串文字相匹配?,string,match,rust,String,Match,Rust,我试图找出如何匹配Rust中的字符串 我最初尝试这样匹配,但我发现Rust不能隐式地从std::string::string转换为&str fn main() { let stringthing = String::from("c"); match stringthing { "a" => println!("0"), "b" => println!("1"), "c" => println!("2"),
字符串
我最初尝试这样匹配,但我发现Rust不能隐式地从std::string::string
转换为&str
fn main() {
let stringthing = String::from("c");
match stringthing {
"a" => println!("0"),
"b" => println!("1"),
"c" => println!("2"),
}
}
fn main() {
let stringthing = String::from("c");
match stringthing {
String::from("a") => println!("0"),
String::from("b") => println!("1"),
String::from("c") => println!("2"),
}
}
这有一个错误:
错误[E0308]:类型不匹配
-->src/main.rs:4:9
|
4 |“a”=>println!("0"),
|^^^应为结构'std::string::string',找到引用
|
=注意:应为'std::string::string'类型`
找到类型`&'static str`
然后我尝试构造新的String
对象,因为我找不到将String
强制转换为&str
的函数
fn main() {
let stringthing = String::from("c");
match stringthing {
"a" => println!("0"),
"b" => println!("1"),
"c" => println!("2"),
}
}
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次以下错误:
错误[E0164]:`String::from`未命名元组变量或元组结构
-->src/main.rs:4:9
|
4 | String::from(“a”)=>返回0,
|不是元组变量或结构
如何实际匹配Rust中的String
s
编者按:这个答案适用于Rust 1.0之前的版本,在Rust 1.0中不起作用
可以在字符串切片上进行匹配
match stringthing.as_slice() {
"a" => println!("0"),
"b" => println!("1"),
"c" => println!("2"),
_ => println!("something else!"),
}
由于_slice
已被弃用,您现在应该使用traitstd::convert::AsRef
:
match stringthing.as_ref() {
"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!"),
}
你也可以这样做
match &stringthing as &str {
"a" => println!("0"),
"b" => println!("1"),
"c" => println!("2"),
_ => println!("something else!"),
}
见:
您可以尝试:
fn main() {
let stringthing = String::from("c");
match &*stringthing {
"a" => println!("0"),
"b" => println!("1"),
"c" => println!("2"),
_ => println!("else")
}
}
通过执行以下操作,可以将字符串转换为&str:
fn main() {
let stringthing = String::from("c");
match &stringthing[..] {
"a" => println!("0"),
"b" => println!("1"),
"c" => println!("2"),
}
}使用rust 1.4.0可以使用trim()
功能。仅将用作\u ref()
与字符串不匹配。我认为匹配失败是因为trim()
删除了空格。这对于延迟匹配用户输入很好。它不起作用。它只能匹配u。如果我从读取行获取字符串。我不知道rust如何管理不同类型的字符串,但是。最好使用。as_ref()
或。as_str()
,两者都没有所有权。stringthing。as_str()
可能是所有答案中最简单的一个;我不喜欢as_-ref
,因为它不必要的笼统,可能会导致错误,而且不那么明确,不完全清楚as_-ref()
是否会成为&str
,as_-str
简单明了。@Zorf你说得对。当as_str
还不存在时,答案被接受。我更改了已接受的答案,但感谢所有回答此问题的人!如果你解释一下&*stringthing
的意思和作用,可能会提高你答案的有用性。这实际上与相同。as_str()
短得多。“.as_str()”实际上比“as&str”多1个字符?我错过什么了吗@扁桃体