Generic Types: Kod Tekrarını Önleyen Esnek Tipler

  • Konbuyu başlatan Konbuyu başlatan irfo
  • Başlangıç tarihi Başlangıç tarihi

irfo

Moderatör
Top Poster Of Month
Katılım
7 Ocak 2026
Mesajlar
290
Tepkime puanı
2
Puanları
18
Rust'ta Generic Types (Genel Tipler), kodunuzu belirli bir veri tipine hapsetmek yerine, birden fazla tiple çalışabilen esnek ve yeniden kullanılabilir yapılar oluşturmanızı sağlar. Generic'ler sayesinde aynı mantığı i32, f64 veya kendi oluşturduğunuz bir struct için ayrı ayrı yazmak zorunda kalmazsınız.
Performans açısından en önemli nokta şudur: Rust, generic yapıları derleme aşamasında özelleştirir (monomorphization), bu yüzden çalışma zamanında (runtime) hiçbir performans kaybı yaşanmaz.

1. Fonksiyonlarda Generic Kullanımı​

Bir fonksiyonun farklı tiplerle çalışmasını istiyorsanız, fonksiyon isminden sonra <T> (genellikle Type'ın baş harfi kullanılır) ifadesini eklersiniz.
Rust
Kod:
// T herhangi bir tipi temsil eder
fn ekrana_bas<T: std::fmt::Display>(oge: T) {
    println!("Değer: {}", oge);
}

fn main() {
    ekrana_bas(5);        // i32 ile çalışır
    ekrana_bas("Selam");  // &str ile çalışır
}
Not: Yukarıdaki : std::fmt::Display kısmı bir Trait Bound'dur. Derleyiciye "T her şey olabilir ama ekrana basılabilir (Display özelliği olan) bir şey olmalı" deriz.

2. Struct Yapılarında Generic​

Bir struct'ın içinde farklı tiplerde veriler saklamak istediğinizde generic'ler hayat kurtarır.
Rust
Kod:
struct Nokta<T> {
    x: T,
    y: T,
}

fn main() {
    let tam_sayi = Nokta { x: 5, y: 10 };
    let ondalikli = Nokta { x: 1.0, y: 4.0 };
    
    // let hata = Nokta { x: 5, y: 4.0 }; // HATA! x ve y aynı T tipi olmalı.
}
Eğer x ve y değerlerinin farklı tiplerde olabilmesini istiyorsanız, iki farklı generic parametre kullanmalısınız: struct Nokta<T, U> { x: T, y: U }.

3. Enum Yapılarında Generic​

Aslında Rust'ın en meşhur iki yapısı, generic enum'lardır. Bunları her gün kullanıyoruz:
  • Option<T>: Some(T) veya None döner. İçindeki değer her tipte olabilir.
  • Result<T, E>: İşlem başarılıysa T tipinde veri, başarısızsa E tipinde hata döner.

4. Metot Tanımlarında Generic​

Generic bir struct için metot yazarken, impl anahtar kelimesinden sonra da tipi belirtmeniz gerekir.
Rust
Kod:
impl<T> Nokta<T> {
    fn x_degerini_al(&self) -> &T {
        &self.x
    }
}
Ayrıca, sadece belirli tipler için geçerli olan metotlar da yazabilirsiniz. Örneğin, sadece f32 olan noktalar için bir metot:
Rust
Kod:
impl Nokta<f32> {
    fn orijine_uzaklik(&self) -> f32 {
        (self.x.powi(2) + self.y.powi(2)).sqrt()
    }
}

5. Performans: Monomorphization​

"Genel bir tip kullanmak programı yavaşlatır mı?" sorusunun cevabı Rust için **"Hayır"**dır. Derleyici, kodunuzda kullanılan her somut tip için generic kodun bir kopyasını oluşturur.
Örneğin, siz Nokta<T> yazıp hem i32 hem f64 kullandığınızda, Rust derleyicisi arka planda iki farklı struct (Nokta_i32 ve Nokta_f64) varmış gibi makine kodu üretir. Bu sayede statik tipli dillerin hızını generic esnekliğiyle birleştirir.

Özet​

YapıAmacı
<T>"Herhangi bir tip" anlamına gelen yer tutucu.
EsneklikAynı kodun farklı veri tipleriyle çalışmasını sağlar.
GüvenlikDerleme zamanında tip kontrolü devam eder.
PerformansMonomorphization sayesinde çalışma zamanı yükü sıfırdır.
 
Geri
Üst