4

s のスライスでスライス パターンを使用しようとしていますStringStringRust はスライスの s を&strリテラルと一致させないため、これは機能しません。Strings のスライスをs のスライスに変換する方法がわかりませんでした&str

#![feature(slice_patterns)]

fn main() {
    // A slice of strings.
    let x = ["foo".to_owned(), "bar".to_owned()];
    match x {
        ["foo", y] => println!("y is {}.", y),
        _ => println!("I did not expect this."),
    }
}

遊び場

4

1 に答える 1

2

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()

于 2015-11-22T19:51:41.710 に答える