Türetme (Deriving)

Desteklenen özellikler (traits), özel türleriniz için aşağıdaki gibi otomatik olarak gerçekleştirilebilir (implemented):

#[derive(Debug, Clone, Default)]
struct Player {
    name: String,
    strength: u8,
    hit_points: u8,
}

fn main() {
    let p1 = Player::default(); // Default özelliği (trait) `default` yapıcısını (constructor) ekler.
    let mut p2 = p1.clone(); // Clone özelliği (trait) `clone` metodunu ekler.
    p2.name = String::from("EldurScrollz");
    // Debug özelliği (trait) `{:?}` ile yazdırma desteği ekler.
    println!("{p1:?} vs. {p2:?}");
}
This slide should take about 3 minutes.
  • Türetme (derivation), makrolarla gerçekleştirilir (implemented) ve birçok kasa (crate) kullanışlı fonksiyonellik eklemek için faydalı türetme (derive) makroları sağlar. Örneğin, serde, #[derive(Serialize)] kullanarak bir yapı (struct) için serileştirme desteği türetebilir.

  • Türetme (derivation) genellikle, çoğu durum için doğru olan yaygın bir basmakalıpsal (boilerplate-y) gerçekleştirmeye sahip özellikler (traits) için sağlanır. Örneğin, bir manuel Clone gerçekleştiriminin (impl) özelliği (trait) türetmeye kıyasla nasıl tekrarlanabilen bir yapıda olabileceğini gösterin:

    impl Clone for Player {
        fn clone(&self) -> Self {
            Player {
                name: self.name.clone(),
                strength: self.strength.clone(),
                hit_points: self.hit_points.clone(),
            }
        }
    }

    Yukarıdaki .clone()’ların hepsi bu durumda gerekli değildir, ancak bu, manuel gerçekleştirmelerin (impls) izleyeceği genel basmakalıpsal (boilerplate-y) deseni gösterir, bu da öğrencilere derive kullanımını netleştirmeye yardımcı olmalıdır.