Özellik (Trait) Sınırları

Jeneriklerle (generics) çalışırken, genellikle türlerin bazı özellikleri (trait) gerçekleştirmesini (implement) istersiniz, böylece bu özelliğin metotlarını çağırabilirsiniz.

Bunu T: Trait ile yapabilirsiniz:

fn duplicate<T: Clone>(a: T) -> (T, T) {
    (a.clone(), a.clone())
}

struct NotCloneable;

fn main() {
    let foo = String::from("foo");
    let pair = duplicate(foo);
    println!("{pair:?}");
}
This slide should take about 8 minutes.
  • Bir NotCloneable yapıp duplicate’e geçirmeyi deneyin.

  • Birden fazla özellik (trait) gerektiğinde, bunları birleştirmek için + kullanın.

  • Öğrencilerin kod okurken karşılaşacakları bir where yan tümcesi gösterin.

    fn duplicate<T>(a: T) -> (T, T)
    where
        T: Clone,
    {
        (a.clone(), a.clone())
    }
    • Çok sayıda parametreniz varsa fonksiyon imzasını (signature) sadeleştirir.
    • Daha güçlü kılan ek özelliklere sahiptir.
      • Birisi sorarsa, ekstra özellik, “:” solundaki türün Option<T> gibi keyfi olabilmesidir.
  • Rust’ın (şimdilik) özelleştirmeyi (specialization) desteklemediğini unutmayın. Örneğin, orijinal duplicate verildiğinde, özel bir duplicate(a: u32) eklemek geçersizdir.