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になります。incはself.value += self.stepで正しく動いていますが、stepが0なので何を足してもvalueは変わりません。構造体更新記法は「書かなかったフィールドは呼び出し側の意図した値ではなく、常にDefaultの値になる」という点に注意が必要です。増分として使うつもりだったstepも明示的に指定します:
fn main() {
let mut c = Counter { value: 10, step: 5 };
c.inc();
c.inc();
println!("{}", c.value);
}