Ana içeriğe geç
Modül 5 · Ders 1 ders 2Kurstaki 9/14~12 min
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:

Rust
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:

Rust
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:

Rust
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:

Rust
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ı

Egzersiz#rust.m5.l1.e1
Denemeler: 0Yükleniyor…

İ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.

Düzenleyici yükleniyor…
İ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

Egzersiz#rust.m5.l1.e2
Denemeler: 0Yükleniyor…

İ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.

Düzenleyici yükleniyor…
İ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ı

Egzersiz#rust.m5.l1.e3
Denemeler: 0Yükleniyor…

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.

Düzenleyici yükleniyor…
İ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