Подтвердить что ты не робот

Есть ли более быстрый/более короткий способ инициализации переменных в структуре Rust?

В следующем примере я бы предпочел присвоить значение каждому полю в структуре в объявлении полей. В качестве альтернативы, он эффективно принимает один дополнительный оператор для каждого поля, чтобы назначить значение для полей. Все, что я хочу сделать, это присвоить значения по умолчанию при создании экземпляра struct.

Есть ли более краткий способ сделать это?

struct cParams {
    iInsertMax: i64,
    iUpdateMax: i64,
    iDeleteMax: i64,
    iInstanceMax: i64,
    tFirstInstance: bool,
    tCreateTables: bool,
    tContinue: bool,
}

impl cParams {
    fn new() -> cParams {
        cParams {
            iInsertMax: -1,
            iUpdateMax: -1,
            iDeleteMax: -1,
            iInstanceMax: -1,
            tFirstInstance: false,
            tCreateTables: false,
            tContinue: false,
        }
    }
}
4b9b3361

Ответ 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() };