Genelleştirilmiş (Generic) Özellikler (Traits)

Özellikler (traits), tıpkı türler ve fonksiyonlar gibi genelleştirilmiş (generic) de olabilir. Bir özelliğin parametreleri, kullanıldığında belirli (concrete) türler alır. Örneğin, From<T> özelliği tür dönüşümlerini (type conversions) tanımlamak için kullanılır:

#![allow(unused)]
fn main() {
pub trait From<T>: Sized {
    fn from(value: T) -> Self;
}
}
#[derive(Debug)]
struct Foo(String);

impl From<u32> for Foo {
    fn from(from: u32) -> Foo {
        Foo(format!("Tamsayıdan dönüştürüldü: {from}"))
    }
}

impl From<bool> for Foo {
    fn from(from: bool) -> Foo {
        Foo(format!("Bool'dan dönüştürüldü: {from}"))
    }
}

fn main() {
    let from_int = Foo::from(123);
    let from_bool = Foo::from(true);
    dbg!(from_int);
    dbg!(from_bool);
}
  • From özelliği (trait) kursun ilerleyen bölümlerinde ele alınacaktır, ancak std belgelerindeki tanımı basittir ve referans için buraya kopyalanmıştır.

  • Özelliğin (trait) gerçekleştirmeleri (implementations), olası tüm tür parametrelerini kapsamak zorunda değildir. Burada, Foo için From<&str> gerçekleştirmesi olmadığından Foo::from("hello") derlenmezdi.

  • Genelleştirilmiş (generic) özellikler (traits) türleri “girdi” olarak alırken, ilişkili türler (associated types) bir tür “çıktı” türüdür. Bir özelliğin farklı girdi türleri için birden çok gerçekleştirmesi (implementation) olabilir.

  • Aslında, Rust herhangi bir T türü için bir özelliğin (trait) en fazla bir gerçekleştiriminin (implementation) eşleşmesini gerektirir. Diğer bazı dillerden farklı olarak, Rust’ın “en spesifik” eşleşmeyi seçmek için bir sezgisi (heuristic) yoktur. Bu desteği eklemek için özelleştirme (specialization) adı verilen bir çalışma vardır.