Если вы публикуете библиотеку, одна из главных проблем -
как добавлять поля в struct, не ломая код пользователей.
Решение - комбинация:
• #[non_exhaustive]
• приватное поле
Что это даёт:
- Запрещает создавать struct через прямой литерал { ... }
- Заставляет пользователей использовать ваш конструктор
- Позволяет добавлять новые поля позже
- Не ломает существующий код
Без этого:
- добавили поле → breaking change
- пользователи не могут собрать проект
С этим:
- API остаётся стабильным
- можно спокойно развивать библиотеку
Пример
#[derive(Debug)]
#[non_exhaustive]
pub struct Config {
pub timeout: Duration,
pub retries: usize,
// Блокирует создание через Config { ... }
_private: (),
}
impl Config {
pub fn new(timeout: Duration, retries: usize) -> Self {
Self {
timeout,
retries,
_private: (),
}
}
}
#[non_exhaustive] + приватное поле =более стабильный API.
