web-dev-qa-db-ja.com

Rustの文字列リテラルに対して文字列を一致させる方法は?

RustでStringと一致させる方法を見つけようとしています。

最初にこのようにマッチングを試みましたが、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&strにキャストする関数が見つからなかったため、新しいStringオブジェクトを作成しようとしました。

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

RustでStringsを実際に一致させる方法は?

134
Jeroen Bollen

as_sliceは非推奨です。代わりに、特性std::convert::AsRefを使用する必要があります。

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

また、キャッチオールケースを明示的に処理する必要があることに注意してください。

151
Tijs Maas

次のようなことができます:

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!"),
}
23

あなたもできる

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

見る:

15

編集者注:この回答は、1.0より前のRustのバージョンに関するものであり、Rust 1.0では機能しません

文字列スライスで一致させることができます。

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