Rustでhead::tail, first::restのようなパターンマッチがしたい


結論

[first, rest @ ..] でOK

コード

Rust Playgroundでの動作確認済みのコードです
https://play.rust-lang.org/

fn match_test(s: &[char]) {
    match s {
        [first, rest @ ..] => { 
            print!("{}", first);
            match_test(rest);
        }
        _ => print!("\nend"),
    }
}

fn main() {
    match_test(&vec!['h', 'e', 'l', 'l', 'o']);
}

結局

Subslice patternsという名前で既に安定化されているものらしいことがわかりました。
https://blog.rust-lang.org/inside-rust/2020/03/04/recent-future-pattern-matching-improvements.html

まだ初心者なのでよくわかってないですが、Vecだとどうもできないみたいです。(スライスとVecの違いもわかってない。調べねば……)

あと、かつてはnightlyで
[first, rest..] という記法が存在していたようです。
が、現在これはnightlyでも動かないみたいです。。。
(これに非常に惑わされた。参考にしていたコードがこの記法をnightlyで使っていたので……。)

おまけ(追記)

[rest @ .., last]
[first , rest @ .., last]

こんなアクロバティックなことも出来る模様。Scalaなどではこんなこと出来なかったような……。

検索用
スライスのパターンマッチ
Vecのパターンマッチ