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, ancakstd
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çinFrom<&str>
gerçekleştirmesi olmadığındanFoo::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.