Чистый способ для структуры переназначить несколько полей, используя связанную функцию? - PullRequest
0 голосов
/ 20 октября 2018

Рассмотрим игровую площадку пример:

#[allow(dead_code)]
struct Things {
    zero: usize,
    one: usize,
    ...
    nine: usize,
}

fn do_fancy_calculation() -> (usize, usize, usize, usize, usize) {
    (1, 1, 1, 1, 1)
}

impl Things {
    fn renew(&mut self) {
        // does not work:
        // let self {one, two, five, seven, eight} = do_fancy_calculation();

        //
        let (one, two, five, seven, eight) = do_fancy_calculation();
        self.one = one;
        self.two = two;
        self.five = five;
        self.seven = seven;
        self.eight = eight;
    }
}

fn main() {
    let (zero, one, two, three, four, five, six, seven, eight, nine) =
        (0, 0, 0, 0, 0, 0, 0, 0, 0, 0);

    let mut things = Things {
        zero,
        ...
        nine,
    };

    things.renew();

    println!("{}", things.one);
}

Как мне приятно назначить one, two, five, seven, eight, не прибегая к нескольким операторам типа self.x = y;?

Я вызываю игрушечную ассоциированную функцию renew, потому что в моем реальном случае использования структура представляет состояние чего-либо, и мне нужно обновить / обновить / воссоздать некоторые переменные для представления изменений в состоянии.Собираюсь ли я решить мой вариант использования неправильно?

1 Ответ

0 голосов
/ 20 октября 2018

Вы можете обновить подмножество полей self, используя присвоение:

*self = Self { one, two, five, seven, eight, ..*self };

Это обновит именованные поля соответствующими локальными переменными и оставит оставшиеся поля без изменений.Я не уверен, однако, является ли это более читабельным, чем то, что у вас есть.

Я бы также рассмотрел несколько других вариантов.Возвращаемый тип do_fancy_calculation() на самом деле не имеет большого значения - может быть, вместо него возвращается struct?Если функция всегда используется для обновления состояния Thing s, вы можете сделать ее ассоциированной функцией, которая непосредственно обновляет Thing, поэтому вам больше не нужно будет сливать возвращаемые значения в Thing.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...