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:?}"); }
-
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 öğrencilerederive
kullanımını netleştirmeye yardımcı olmalıdır.