Özelliklerin (Traits) Gerçekleştirimi

trait Pet {
    fn talk(&self) -> String;

    fn greet(&self) {
        println!("Ah sen ne şirinsin! Adın ne? {}", self.talk());
    }
}

struct Dog {
    name: String,
    age: i8,
}

impl Pet for Dog {
    fn talk(&self) -> String {
        format!("Hav, benim adım {}!", self.name)
    }
}

fn main() {
    let fido = Dog { name: String::from("Fido"), age: 5 };
    dbg!(fido.talk());
    fido.greet();
}
  • Type için Trait’i gerçekleştirmek (implement) üzere bir impl Trait for Type { .. } bloğu kullanırsınız.

  • Go arayüzlerinin (interfaces) aksine, sadece eşleşen metotlara sahip olmak yeterli değildir: talk() metoduna sahip bir Cat türü, bir impl Pet bloğunda olmadığı sürece Pet’i otomatik olarak karşılamaz.

  • Özellikler (traits), bazı metotların varsayılan gerçekleştirmelerini (implementations) sağlayabilir. Varsayılan gerçekleştirmeler, özelliğin tüm metotlarına dayanabilir. Bu durumda, greet sağlanır ve talk’a dayanır.

  • Belirli bir tür için birden fazla impl bloğuna izin verilir. Bu hem doğal impl bloklarını hem de özellik (trait) impl bloklarını içerir. Aynı şekilde belirli bir tür için birden fazla özellik gerçekleştirilebilir (ve genellikle türler birçok özelliği gerçekleştirir!). impl blokları birden fazla modüle/dosyaya bile yayılabilir.