文字列を文字列リテラルと一致させるにはどうすればいいですか? 質問する

文字列を文字列リテラルと一致させるにはどうすればいいですか? 質問する

StringRust でa を一致させる方法を考えています。

std::string::String最初はこのようにマッチングしようとしましたが、Rustではから に暗黙的にキャストできないことがわかりました&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`

次に、 a をa に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

StringRust で実際に s を一致させるにはどうすればよいでしょうか?

ベストアンサー1

更新:を に.as_str()変換するには次のようにします:String&str

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

Reason .as_str()はより簡潔で、より厳密な型チェックを強制します。特性はas_ref複数の型に対して実装されており、その動作は型に対して変更される可能性がありString、予期しない結果につながります。同様に、入力引数の型が変更された場合、その型が特性を実装しているときにコンパイラは問題を通知しませんas_ref

ドキュメントas_strでは、使用も推奨されていますString 構造体プリミティブ

古い回答:

as_sliceは非推奨になりました。代わりに次の特性を使用してくださいstd::convert::AsRef

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

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

おすすめ記事