String
Rust で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
String
Rust で実際に 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!"),
}
キャッチオールケースも明示的に処理する必要があることに注意してください。