Как сопоставить строку со строковыми литералами в Rust?


Я пытаюсь выяснить, как, чтобы соответствовать String в Русте.

Я изначально пытался сопоставить это, но я понял, что ржавчина не может неявно отбрасываться от 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ы в раст?

4 93

4 ответа:

as_slice является устаревшим, теперь вы должны использовать признак std::convert::AsRef вместо:

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

посмотреть:

вы можете сделать что-то вроде этого:

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

есть еще as_str метод от ржавчины 1.7.0:

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

Примечание редактора: Этот ответ относится к версии Rust до 1.0 и не работает в Rust 1.0

вы можете сопоставить на срезе строки.

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