Namaran

Code daily. Without assist.

2026-09-20

sum_to.rs

fn sum_to(n: u32) -> u32 {
    let total = 0;
    for i in 1..=n {
        total = total + i;
    }
    total
}

fn main() {
    println!("{}", sum_to(5));
}

1からnまでの合計を求めるつもりですが、このコードはコンパイルできません。何が問題で、どう直せばよいでしょうか?

Answer

let total = 0;mutを付けていないので、totalは初期化はできても以後は再代入できない変数として束縛されます。ループの中のtotal = total + i;はまさにその再代入で、コンパイラは「cannot assign twice to immutable variable」というエラーを出します。Rustでは、letによる初期化とその後の再代入は別の権限として扱われ、変数を1回書き込んだあとに書き換える可能性があるなら、宣言の時点でmutを付けて明示しておく必要があります。ループでアキュムレータ(累積用の変数)を更新するのはまさにその「書き換える可能性がある」場合にあたるので、mutを付ければ直ります:

fn sum_to(n: u32) -> u32 {
    let mut total = 0;
    for i in 1..=n {
        total += i;
    }
    total
}

fn main() {
    println!("{}", sum_to(5));
}