Ответ 1
Вы можете указать значения по умолчанию для своей структуры, реализуя признак 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 для представления специального значения "бесконечный" или "нет max". В 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() };