Rustで文字列を文字列リテラルと照合する方法は?


199

StringRust でaを一致させる方法を理解しようとしています。

私は最初にこのようにマッチングを試みましたが、Rustが暗黙的にstd::string::Stringto からキャストできないことを理解しました&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、a 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を一致させる方法は?


stringthing.as_str()おそらくすべての答えの中で最も簡単です。私は好きではないas_ref、それはバグにつながることができ、必要以上に一般的だし、明示的なないので、それは完全にそれがクリアされていないas_ref()ことになるだろう&stras_str単純明快です。
Zorf

@Zorfその通りです。回答がas_strまだ存在しない場合は、回答が受け入れられました。承認済みの回答を変更しましたが、この質問に回答したすべての人に感謝します!
Jeroen

回答:


70

あなたはこのようなことをすることができます:

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

as_strRust 1.7.0以降のメソッドもあります。

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

189

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

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

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


3
rust 1.4.0を使用すると、trim()関数を使用できます。使用するだけas_ref()では文字列と一致しません。
futtetennista

1
空白がtrim()削除されるため、一致は失敗すると思います。これは、遅延をユーザー入力と照合するのに適しています。
Gerard Sexton

1
動かない。read_lineからStringを取得した場合のみ、_と一致します。
仮面の男

rustがさまざまなタイプの文字列をどのように管理するかについてはよくわかりませんが、基本的な例で動作するようです。
tforgione


10

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

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

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

.as_ref()またはを使用する方が良い.as_str()です。どちらも所有権を取得しませんでした。
Abrar Khan、

1

あなたが試すことができます:

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

1
&*stringthing意味と機能を説明すると、回答の有用性が高まる可能性があります。
Seth Difley
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.