Вы можете предоставить значения по умолчанию для своей структуры, реализовав 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)]
структуру данных, компилятор автоматически создаст для вас функцию по умолчанию, которая заполняет каждое поле своим значением по умолчанию. Логическое значение по умолчанию - false, целое значение по умолчанию - 0.
Целочисленное значение по умолчанию, равное 0, представляет собой проблему, поскольку вы хотите, чтобы целочисленные поля были по умолчанию равны -1. Вы можете определить новый тип, который реализует значение по умолчанию -1, и использовать его вместо i64
своей структуры. (Я не тестировал это, но он должен работать).
Однако я бы посоветовал немного изменить структуру данных и использовать Option<i64>
вместо i64
. Я не знаю контекста вашего кода, но похоже, что вы используете специальное значение -1 для представления специального значения «бесконечный» или «нет максимума». В Rust мы используем 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() };