1. ホーム
  2. string

[解決済み】文字列リテラルに対して文字列をマッチングさせる方法は?

2022-03-27 13:59:52

質問

をどのようにマッチングさせるか考えています。 String をRustで作成しました。

最初はこのようにマッチングさせようとしたのですが、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で作成することはできますか?

どのように解決するのですか?

次のような方法があります。

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