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


199

我试图找出如何匹配StringRust 中的一个。

我最初尝试像这样进行匹配,但是我发现Rust不能隐式地从转换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在Rust中实际匹配s?


stringthing.as_str()这可能是所有答案中最简单的答案;我不喜欢as_ref,因为它是不必要一般情况下,这可能会导致错误,而不是明确的,它并没有完全清除as_ref()将是一个&stras_str简单明了。
佐夫

@佐夫你是对的。答案as_str尚不存在时被接受。我更改了接受的答案,但感谢所有回答此问题的人!
Jeroen

Answers:


69

您可以执行以下操作:

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

as_str从Rust 1.7.0开始,还有一种方法:

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

188

as_slice已弃用,现在应std::convert::AsRef改为使用trait :

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

请注意,您还必须明确处理所有问题。


3
使用rust 1.4.0可以使用该trim()功能。仅使用as_ref()与字符串不匹配。
futtetennista 2015年

1
我认为匹配失败是因为trim()删除了空格。这对于将延迟与用户输入进行匹配非常有用。
Gerard Sexton

1
没用 如果我从read_line获取String,它只能匹配_。
蒙面侠

对rust如何管理不同类型的字符串了解不多,但似乎可以在一个基本示例上使用
tforgione


10

编者注:此答案与1.0之前的Rust版本有关,在Rust 1.0中不起作用

您可以在字符串切片上进行匹配。

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

最好使用.as_ref().as_str(),两者均未拥有所有权。
阿布拉·汗

1

你可以试试:

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

1
如果您解释&*stringthing含义和作用,则可能会提高答案的实用性。
塞思·迪夫利
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.