История вопроса:
Rust придерживается философии явной инициализации. Для некоторых стандартных коллекций и обобщённых типов часто требуется иметь значение "по умолчанию". Однако для сложных структурнередко бывает неоднозначно, как именно их создавать без параметров. С этой целью введён trait Default, который задаёт стандартный конструктор.
Проблема:
Чтобы писать универсальные контейнеры и алгоритмы, где иногда ожидается дефолтное значение (например, в Option::unwrap_or_default, Vec::resize), нужен механизм создания экземпляра без передачи аргументов. Но не все типы подходят для такого конструктора; иногда дефолтное значение может быть неочевидным и опасным.
Решение:
default(), возвращающий некий экземпляр (обычно "пустой", zeroed или с предусловиями).Пример кода:
#[derive(Default, Debug)] struct Config { retries: u32, verbose: bool, } fn main() { let cfg = Config::default(); println!("{:?}", cfg); }
Ключевые особенности:
Будет ли принудительно вызван Default::default для Option<T>, если T: Default?
Нет, Optional не вызывает default для T автоматически; unwrap_or_default вызывается явно.
Могут ли параметры со значением по умолчанию быть заданы через Default trait в конструкторе структуры?
Нет, Default создаёт всю структуру целиком, индивидуальные поля по умолчанию нельзя подменить обычным синтаксисом конструктора.
Может ли derive(Default) сломаться для структуры с полями, не реализующими Default?
Да, derive(Default) работает только если все поля структуры реализуют Default.
Config c Default, где порт сервера — 0 (невалидное значение по умолчанию). Программа неожиданно запускается не на том порту.
Плюсы:
Минусы:
Default для структуры настроек с безопасными, консенсусными значениями (retries=3, verbose=false).
Плюсы:
Минусы: