Namaran

Code daily. Without assist.

2026-09-13

alt_sum.rs

fn alt(xs: &[i32]) -> i32 {
    match xs {
        [] => 0,
        [x, rest @ ..] => x - alt(rest),
    }
}

fn main() {
    println!("{}", alt(&[5, 3, 2, 1]));
}

これは何を出力するでしょうか?

Answer

3(その後に改行)。スライスパターン[x, rest @ ..]は「先頭1個」と「残りのスライス」に分け、restは元の配列を指す&[i32]なのでコピーは起きません。展開すると5 - (3 - (2 - (1 - 0)))で、内側から1123です。括弧を外すと5 - 3 + 2 - 1、つまり「引く」を右から畳み込むと符号が交互に反転して交代和になります。match[][x, rest @ ..]でスライスのあらゆる長さを網羅していることをコンパイラが確認するので、基底ケースを書き忘れればコンパイルが通りません。