Наследование
Поддерживаемые трейты можно автоматически реализовать для ваших пользовательских типов следующим образом:
// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0
#[derive(Debug, Clone, Default)]
struct Player {
name: String,
strength: u8,
hit_points: u8,
}
fn main() {
let p1 = Player::default(); // Трейт Default добавляет конструктор `default`.
let mut p2 = p1.clone(); // Трейт Clone добавляет метод `clone`.
p2.name = String::from("EldurScrollz");
// Трейт Debug добавляет поддержку вывода через `{:?}`.
println!("{p1:?} vs. {p2:?}");
}
-
Производные реализации создаются с помощью макросов, и многие крейты предоставляют полезные производные макросы, которые добавляют полезную функциональность. Например,
serdeможет сгенерировать поддержку сериализации для структуры через#[derive(Serialize)]. -
Производные реализации обычно предлагают для трейтов, у которых есть типовая шаблонная реализация, корректная в большинстве случаев. Например, покажите, как ручная реализация
Cloneможет быть повторяющейся по сравнению с производным трейтом:// Copyright 2023 Google LLC // SPDX-License-Identifier: Apache-2.0 impl Clone for Player { fn clone(&self) -> Self { Player { name: self.name.clone(), strength: self.strength.clone(), hit_points: self.hit_points.clone(), } } }Не все
.clone()в примере выше здесь необходимы, но это демонстрирует типовой шаблонный подход, которому следовали бы ручные реализации, и это должно помочь студентам понять смыслderive.