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) 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.