Modül dersleri (1/2)
Jenerikler ve Fonksiyonlar
Geneller, farklı veri türleri için mantığın tekrarlanmasını önleyerek esnek, yeniden kullanılabilir kod yazmanıza olanak tanır. Farklı türler için birden fazla işlev veya yapı tanımlamak yerine (i32, f64 veya String gibi), geleneksel olarak T harfiyle temsil edilen genel bir tür parametresi kullanabiliriz.
Rust derleyicisi jenerikleri monomorfizasyon adı verilen bir işlemi kullanarak yönetir: derleme sırasında, gerçekte kullanılan her somut tür için genel kodun bir kopyasını oluşturur. Bu, sıfır çalışma zamanı performansı yükü olduğu anlamına gelir.
Genel Fonksiyonlar
Genel bir işlev tanımlamak için, <T> tür parametresini işlev adının hemen sonrasına ve bağımsız değişken listesinin önüne ekleriz:
fn print_value<T: std::fmt::Debug>(value: T) {
println!("Value: {:?}", value);
}Genel işlevlerde, hem bağımsız değişken türleri hem de dönüş türleri için T genel türünü kullanabiliriz:
fn identity<T>(value: T) -> T {
value
}Genel Yapılar
Esnek alanları tanımlamak için yapıların (struct) içindeki genel tür parametrelerini de kullanabiliriz:
struct KeyValuePair<K, V> {
key: K,
value: V,
}
fn main() {
let pair = KeyValuePair {
key: String::from("age"),
value: 30,
};
}Genel bir yapı için bir impl bloğunda, yöntemleri genel bir yapı üzerinde uyguladığımızı belirtmek için impl anahtar sözcüğünden hemen sonra <T> tür parametresini bildirmemiz gerekir:
struct Container<T> {
value: T,
}
impl<T> Container<T> {
fn new(value: T) -> Self {
Container { value }
}
fn value(&self) -> &T {
&self.value
}
}Kendin dene
Alıştırma 1: Nokta Yapısı
İki alanla Point<T> adında genel bir yapı tanımlayın: T türünde x ve T türünde y. Ana işlevde, x = 5 ve y = 10 tamsayı değerlerine sahip bir Nokta içeren değişken bir nokta oluşturun, ardından point.x'in değerini yazdırın.
İpucu göster
`struct Point<T> { x: T, y: T }` kullanarak yapıyı bildirin. Bunu ana dosyada oluşturun ve yazdırmak için 'point.x'i kullanın.
3 denemeden sonra çözüm mevcut
Alıştırma 2: Bir Tuple'ı takasla tersine çevirmek
İki öğeden (T, T) oluşan bir demet'i kabul eden ve konumları tersine çevrilmiş yeni bir demet (T, T) döndüren swap<T> adında genel bir işlev yazın. Ana fonksiyonda tuple (1, 2) ile fonksiyonu çağırın ve sonucu yazdırın.
İpucu göster
İşlev imzası "fn swap<T>(pair: (T, T)) -> (T, T)" olmalıdır. `(pair.1,pair.0)` ile ters çevrilmiş tuple'ı döndürün.
3 denemeden sonra çözüm mevcut
Alıştırma 3: Konteyner Yapısı
T türünde bir değer alanı içeren genel bir yapı Container<T> tanımlayın. T türünde bir değer kabul eden ve Container<T> örneğini döndüren yeni bir yöntem tanımlamak için genel bir impl bloğu uygulayın.
İpucu göster
İlgili yöntemi uygulamak için `impl<T> Container<T>` kullanın`fn new(value: T) -> Self { Container { value } }`.
3 denemeden sonra çözüm mevcut