Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 如何将字符串与字符串文字相匹配?_String_Match_Rust - Fatal编程技术网

String 如何将字符串与字符串文字相匹配?

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中的
字符串

我最初尝试这样匹配,但我发现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
已被弃用,您现在应该使用trait
std::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个字符?我错过什么了吗@扁桃体