Traits (101): Paylaşılan Davranışlar ve Interface Mantığı

  • 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 Traits (Özellikler), farklı veri tiplerinin (struct, enum vb.) sahip olabileceği ortak davranışları tanımlayan bir yapıdır. Diğer dillerdeki "Interface" (Arayüz) kavramına çok benzer ancak Rust'ın tip sisteminde çok daha derin ve güçlü bir rol oynar.
Bir trait, "Bu tipi kullananlar şu fonksiyonları uygulamak zorundadır" diyen bir sözleşmedir.

1. Trait Tanımlama ve Uygulama​

Diyelim ki farklı türdeki içeriklerin (Haber ve Tweet) özetini çıkarmak istiyoruz. Önce bu davranışı tanımlayan bir trait oluştururuz:
Rust
Kod:
pub trait Ozet {
    fn ozet_al(&self) -> String;
}
Şimdi bu özelliği farklı struct'lara uygulayalım:
Rust
Kod:
pub struct Haber {
    pub baslik: String,
    pub yazar: String,
    pub icerik: String,
}

impl Ozet for Haber {
    fn ozet_al(&self) -> String {
        format!("{}, yazan: {}", self.baslik, self.yazar)
    }
}

pub struct Tweet {
    pub kullanici_adi: String,
    pub icerik: String,
}

impl Ozet for Tweet {
    fn ozet_al(&self) -> String {
        format!("{}: {}", self.kullanici_adi, self.icerik)
    }
}

2. Varsayılan Metotlar (Default Implementations)​

Trait içinde bir metodun gövdesini yazarak varsayılan bir davranış belirleyebilirsiniz. Eğer struct bu metodu kendi içinde tekrar tanımlamazsa varsayılan olan kullanılır.
Rust
Kod:
pub trait Ozet {
    fn ozet_al(&self) -> String {
        String::from("(Daha fazla oku...)") // Varsayılan davranış
    }
}

3. Parametre Olarak Trait (Trait Bounds)​

Trait'lerin asıl gücü, fonksiyonları belirli tiplere değil, belirli özelliklere sahip tiplere göre yazabilmemizi sağlamasıdır.
Rust
Kod:
// "Ozet özelliğini uygulayan herhangi bir tipi kabul et"
pub fn haber_kaynas(item: &impl Ozet) {
    println!("Yeni haber! {}", item.ozet_al());
}
Bu yapı, kodunuzu inanılmaz derecede esnek kılar. Fonksiyonunuzun içine Haber mi yoksa Tweet mi geldiğiyle ilgilenmezsiniz; sadece ozet_al metoduna sahip olup olmadığına bakarsınız.

4. Standart Trait'ler (Derivable Traits)​

Rust, en yaygın davranışlar için önceden tanımlanmış trait'ler sunar. Bunları #[derive(...)] özniteliği ile otomatik olarak struct'ınıza ekleyebilirsiniz:
  • Debug: {:?} ile formatlı yazdırmayı sağlar.
  • PartialEq: İki örneği == ile karşılaştırmayı sağlar.
  • Clone / Copy: Verinin kopyalanma davranışını belirler.
Rust
Kod:
#[derive(Debug, PartialEq)]
struct Nokta {
    x: i32,
    y: i32,
}

5. Trait vs Interface: Temel Farklar​

ÖzellikInterface (Java/C#)Trait (Rust)
UygulamaSınıf tanımlanırken belirtilir.Herhangi bir struct için her zaman (dışarıdan bile) uygulanabilir.
Varsayılan MetotKısıtlı destek.Tam destek.
Çakışma Yönetimiİsim çakışmaları zor çözülür.Spesifik metot çağırma (Fully Qualified Syntax) ile kolayca çözülür.
 
Geri
Üst