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でString
sを実際に一致させる方法は?
as_slice
は非推奨です。代わりに、特性std::convert::AsRef
を使用する必要があります。
match stringthing.as_ref() {
"a" => println!("0"),
"b" => println!("1"),
"c" => println!("2"),
_ => println!("something else!"),
}
また、キャッチオールケースを明示的に処理する必要があることに注意してください。
次のようなことができます:
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!"),
}
あなたもできる
match &stringthing as &str {
"a" => println!("0"),
"b" => println!("1"),
"c" => println!("2"),
_ => println!("something else!"),
}
見る:
編集者注:この回答は、1.0より前のRustのバージョンに関するものであり、Rust 1.0では機能しません
文字列スライスで一致させることができます。
match stringthing.as_slice() {
"a" => println!("0"),
"b" => println!("1"),
"c" => println!("2"),
_ => println!("something else!"),
}