Namaran

Code daily. Without assist.

2026-08-23

counter_step.rs

#[derive(Default)]
struct Counter {
    value: i32,
    step: i32,
}

impl Counter {
    fn inc(&mut self) {
        self.value += self.step;
    }
}

fn main() {
    let mut c = Counter { value: 10, ..Default::default() };
    c.inc();
    c.inc();
    println!("{}", c.value);
}

c.inc()を2回呼べばvalueが増えるはずですが、10のまま変わりません。何が問題で、どう直せばよいでしょうか?

Answer

Counter { value: 10, ..Default::default() }valueだけを指定していて、stepを書き忘れています。..Default::default()は指定しなかった残り全てのフィールドをDefault::default()由来の値で埋めるので、stepは静かに0になります。incself.value += self.stepで正しく動いていますが、step0なので何を足してもvalueは変わりません。構造体更新記法は「書かなかったフィールドは呼び出し側の意図した値ではなく、常にDefaultの値になる」という点に注意が必要です。増分として使うつもりだったstepも明示的に指定します:

fn main() {
    let mut c = Counter { value: 10, step: 5 };
    c.inc();
    c.inc();
    println!("{}", c.value);
}