如何在Rust中匹配字符串与字符串文字?

Jer*_*oen 153 string match rust

我正在试图弄清楚如何匹配StringRust.

我最初尝试过像这样的匹配,但我发现Rust不能暗中强制转换std::string::String&str.

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

这有错误:

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`
Run Code Online (Sandbox Code Playgroud)

然后我尝试构造新String对象,因为我找不到将a String转换为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"),
    }
}
Run Code Online (Sandbox Code Playgroud)

这给了我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
Run Code Online (Sandbox Code Playgroud)

如何String在Rust中实际匹配s?

Tij*_*aas 168

as_slice不推荐使用,您现在应该使用特征std::convert::AsRef:

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

请注意,您还必须显式处理catch-all案例.

  • 使用rust 1.4.0可以使用`trim()`函数.只使用`as_ref()`与字符串不匹配. (3认同)
  • 这不起作用。如果我从 read_line 获取字符串,它只能匹配 _ 。 (2认同)
  • @MaskedMan `read_line` 读取一行。行以“\n”结尾。`.trim_end()` (或者更准确地说,`trim_end_matches('\n')`)将为您删除它。 (2认同)

小智 25

你可以这样做:

match &stringthing[..] {
    "a" => println!("0"),
    "b" => println!("1"),
    "c" => println!("2"),
    _ => println!("something else!"),
}
Run Code Online (Sandbox Code Playgroud)

as_strRust 1.7.0 还有一个方法:

match stringthing.as_str() {
    "a" => println!("0"),
    "b" => println!("1"),
    "c" => println!("2"),
    _ => println!("something else!"),
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*ari 15

你也可以这样做

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

看到:

  • “.as_str()”实际上比“as &str”多 1 个字符?我错过了什么吗?@amyiris (3认同)
  • `&x as &str` 是 10 个字符,`x.as_str()` 是 10 个字符。长度相同。 (2认同)

A.B*_*.B. 10

编者注:这个答案适用于1.0之前的Rust版本,并且在Rust 1.0中不起作用

您可以匹配字符串切片.

match stringthing.as_slice() {
    "a" => println!("0"),
    "b" => println!("1"),
    "c" => println!("2"),
    _ => println!("something else!"),
}
Run Code Online (Sandbox Code Playgroud)

  • 最好使用`.as_ref()`或`.as_str()`,两者都没有所有权。 (3认同)