Можна вказати значення за замовчуванням для вашої структури, застосувавши Default
ознаку. default
Функція буде виглядати поточну new
функцію:
impl Default for cParams {
fn default() -> cParams {
cParams {
iInsertMax: -1,
iUpdateMax: -1,
iDeleteMax: -1,
iInstanceMax: -1,
tFirstInstance: false,
tCreateTables: false,
tContinue: false,
}
}
}
Потім можна інстанціювати структуру, вказавши лише значення, що не знаходяться за замовчуванням:
let p = cParams { iInsertMax: 10, ..Default::default() };
З деякими незначними змінами у вашій структурі даних ви можете скористатися автоматично отриманою типовою реалізацією. Якщо ви використовуєте #[derive(Default)]
структуру даних, компілятор автоматично створить для вас функцію за замовчуванням, яка заповнює кожне поле своїм значенням за замовчуванням. Булеве значення за замовчуванням - помилкове, інтегральне значення за замовчуванням - 0.
Тут є проблемою значення за замовчуванням для цілого числа 0, оскільки ви хочете, щоб цілі поля за замовчуванням були -1. Ви можете визначити новий тип, який реалізує значення за замовчуванням -1 та використовувати це замість i64
вашої структури. (Я цього не перевіряв, але це має працювати).
Однак я б радив трохи змінити структуру даних і використовувати Option<i64>
замість цього i64
. Я не знаю контексту вашого коду, але, схоже, ви використовуєте спеціальне значення -1 для позначення спеціального значення "нескінченний" або "немає макс". У Rust, ми використовуємо a, Option
щоб представити необов'язково присутнє значення. Немає потреби в злому -1. Опція може бути будь-якою None
або Some(x)
де x буде вашим i64
тут. Це може бути навіть непідписане ціле число, якби -1 було єдиним від’ємним значенням. Значенням за замовчуванням Option
є None
, тому із запропонованими змінами ваш код може виглядати так:
#[derive(Default)]
struct cParams {
iInsertMax: Option<u64>,
iUpdateMax: Option<u64>,
iDeleteMax: Option<u64>,
iInstanceMax: Option<u64>,
tFirstInstance: bool,
tCreateTables: bool,
tContinue: bool,
}
let p = cParams { iInsertMax: Some(10), ..Default::default() };