Как мне клонировать структуры в Rust без использования Copy или Clone? - PullRequest
0 голосов
/ 23 января 2019

Как создать глубокие копии каждого из этих трех стилей структур?

// A unit struct
struct Thing;

// A tuple struct
struct Thingy(u8, i32);

// regular
struct Location {
    name: String,
    code: i32,
}

Могу ли я сделать это без использования черт Copy или Clone?Если структура уже определена и эти черты не реализованы, есть ли обходной путь?

// without this:
#[derive(Copy, Clone)]
struct Location {
    name: String,
    code: i32,
}

1 Ответ

0 голосов
/ 23 января 2019

Структура объекта не содержит данных, поэтому «глубокая копия» будет просто еще одним ее экземпляром: let thing_clone = Thing;

Для других типов вам просто нужно вручную клонировать поля и создать новыйобъект из клонированных полей.Предполагая, что есть метод new для Thingy и Location:

let thingy_clone = Thingy::new(thingy.0, thingy.1);

let location_clone = Location::new(location.name.clone(), location.code);

Обратите внимание, что я только явно написал .clone() для поля String.Это связано с тем, что u8 и i32 реализуют Copy и, следовательно, будут автоматически копироваться при необходимости.Никакого явного копирования / клонирования не требуется.

Тем не менее, использование черты Clone определенно более идиоматично.Если Thing, Thingy и Location являются частью внешней библиотеки, вы можете отправить отчет об ошибке, попросив внедрить Clone для этих структур.

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