Есть ли быстрее/короче способ, чтобы инициализировать переменные в структуру ржавчины?

В следующем примере, я бы предпочел, чтобы присвоить значение для каждого поля в 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,
        }
    }
}
Решение

Вы можете задать значения по умолчанию для вашей структуры по реализации признака "по умолчанию". Функция по умолчанию, как будет выглядеть ваша нынешняя "новая" функция:

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() };

С некоторыми незначительными изменениями в структуре данных, вы можете воспользоваться автоматически производной реализации по умолчанию. Если вы используете `#[вывести(по умолчанию)] на структуру данных, компилятор автоматически создаст функцию по умолчанию, которая заполняет каждое поле со значением по умолчанию. Булево значение по умолчанию равно false, то интегральное значение по умолчанию-0.

Целое число'значение S по умолчанию 0-это проблема, так как вы хотите, чтобы число полей, которые должны быть -1 по умолчанию. Можно определить новый тип, который реализует значение по умолчанию -1 и использовать, что вместо і64и в свои структуры. (Я не'т тестировал, но должно работать).

Однако, я'д предлагаю немного изменить свою структуру данных и использовать опцию <і64и> вместо і64и. Я не'т знаем контексте вашего кода, но, похоже, вы're, используя специальное значение -1, чтобы представлять особый смысл и"бесконечное и", или "там's нет максимум на". В Русте, мы используем "вариант", чтобы представлять дополнительно присутствует значение. Там's нет необходимости -1 взломать. Вариант может быть либо none или некоторые(х) где X будет вашим і64и здесь. Это может даже быть беззнаковое целое, если -1 было только отрицательное значение. Вариант по умолчанию `` значениенет`, поэтому с предлагаемыми изменениями, ваш код может выглядеть следующим образом:

#[derive(Default)]
struct cParams {
    iInsertMax: Option,
    iUpdateMax: Option,
    iDeleteMax: Option,
    iInstanceMax: Option,
    tFirstInstance: bool,
    tCreateTables: bool,
    tContinue: bool,
}

let p = cParams { iInsertMax: Some(10), ..Default::default() };
Комментарии (8)