Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Наследование

Поддерживаемые трейты можно автоматически реализовать для ваших пользовательских типов следующим образом:

// 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:?}");
}
This slide should take about 3 minutes.
  • Производные реализации создаются с помощью макросов, и многие крейты предоставляют полезные производные макросы, которые добавляют полезную функциональность. Например, 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.