String
技術的には、 s ( ) のスライスではなく、s ( &[String]
) の配列があります。String
[String; 2]
より小さなケースを見てみましょう。
fn main() {
match "foo".to_owned() {
"foo" => println!("matched"),
_ => unreachable!(),
}
}
ここでは、同じエラー メッセージが表示されます。
error[E0308]: mismatched types
--> src/main.rs:3:9
|
3 | "foo" => println!("matched"),
| ^^^^^ expected struct `std::string::String`, found reference
|
= note: expected type `std::string::String`
found type `&'static str`
この場合の修正は、 を に変更することString
です&str
。これは、スライス パターンが理解するものです。
let s = "foo".to_owned();
match s.as_str() {
"foo" => println!("matched"),
_ => unreachable!(),
}
以下も参照してください。
では、これをあなたの例にどのように拡張できますか? 簡単なことは、同じことを 2 回行うことです。
fn main() {
let x = ["foo".to_owned(), "bar".to_owned()];
match [x[0].as_str(), x[1].as_str()] {
["foo", y] => println!("y is {}.", y),
_ => unreachable!(),
}
}
&[T]
ただし、任意の量ではなく 2 つの値のみを処理するため、これはスライス ( ) の場合には機能しません。その場合、一時的な を作成する必要がありますVec
:
fn main() {
let x = ["foo".to_owned(), "bar".to_owned()];
let x2: Vec<_> = x.iter().map(|x| x.as_str()).collect();
match x2.as_slice() {
["foo", y] => println!("y is {}.", y),
_ => unreachable!(),
}
}
スライス パターンはスライスのみを理解するためVec
、 をスライス自体 ( )に変換する必要があることに注意してください。x2.as_slice()