Namaran

Code daily. Without assist.

2026-08-23

counter_default.rs

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

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

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

Counter { step: 3, ..Default::default() }という構造体更新記法に注目してください。これは何を出力するでしょうか?

Answer

3 3(その後に改行)。#[derive(Default)]は各フィールドをその型のデフォルト値(i32なら0)で埋めたCounterを作れるようにします。Counter { step: 3, ..Default::default() }stepだけ明示的に3を指定し、残りのフィールド(value)は..Default::default()によってDefault::default()が作った値からコピーします。つまりvalue0から始まります。Rustには++--という演算子が無いため(前置と後置で意味が変わる紛らわしさを避けるための意図的な設計です)、増減はinc/decメソッドの中でself.value += self.stepself.value -= self.stepと明示的に書きます。incを2回、decを1回呼ぶとvalue0+3+3-3=3になり、stepは変わらず3のままです。