web-dev-qa-db-fra.com

Comment faire correspondre une chaîne à des littéraux de chaîne dans Rust?

J'essaie de comprendre comment faire correspondre un String dans Rust.

J'ai d'abord essayé d'apparier comme ceci, mais j'ai compris Rust ne peut pas implicitement transtyper de std::string::String à &str.

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

Cela a l'erreur:

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`

J'ai ensuite essayé de construire de nouveaux objets String, car je ne trouvais pas de fonction permettant de convertir un String en un &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"),
    }
}

Cela m'a donné l'erreur suivante 3 fois:

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

Comment associer réellement Strings à Rust?

134
Jeroen Bollen

as_slice est obsolète, vous devriez maintenant utiliser le trait std::convert::AsRef au lieu:

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

Notez que vous devez également gérer explicitement le cas fourre-tout.

151
Tijs Maas

Vous pouvez faire quelque chose comme ça:

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

Il y a aussi un as_str méthode à partir de Rust 1.7.0:

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

Tu pourrais aussi faire

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

Voir:

15
Marco Scannadinari

Note de l'éditeur: Cette réponse concerne une version de Rust avant 1.0 et ne fonctionne pas dans Rust 1.0

Vous pouvez faire correspondre une tranche de chaîne.

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