Structs ve Enums: Rust’ta Veri Modelleme Sanatı

  • 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
Yazılım geliştirmede veri modelleme, karmaşık problemleri bilgisayarın anlayabileceği düzenli yapılara dönüştürme sanatıdır. Rust, bu sanatı icra etmeniz için size iki temel araç sunar: Structs (Yapılar) ve Enums (Numaralandırmalar).

C tabanlı dillerden geliyorsanız bu kavramlar tanıdık gelebilir; ancak Rust, bunlara eklediği sahiplik ve örüntü eşleştirme (pattern matching) özellikleri ile veri modellemeyi çok daha güvenli bir seviyeye taşır.


1. Structs (Yapılar): İlişkili Verileri Gruplama​

struct, farklı veri tiplerini tek bir anlamlı paket içinde toplamanızı sağlar. Bir nesnenin özelliklerini tanımlamak için kullanılır.

İsimlendirilmiş Alan Yapıları (Classic Structs)​

En yaygın kullanılan yapı türüdür. Her alanın bir ismi ve tipi vardır.

Kod:
struct Kullanici {

kullanici_adi: String,

eposta: String,

aktif: bool,

giris_sayisi: u64,

}

fn main() {

let mut kullanici1 = Kullanici {

eposta: String::from("[email protected]"),

kullanici_adi: String::from("ali123"),

aktif: true,

giris_sayisi: 1,

};

kullanici1.eposta = String::from("[email protected]");<br>
}

Tuple Structs ve Unit-Like Structs​

Bazen alanlara isim vermek yerine sadece tipleri gruplamak istersiniz (Tuple Struct). Bazen de üzerinde hiç veri taşımayan, sadece bir tip belirten yapılar kurarsınız (Unit-Like Struct).

Kod:
struct Renk(i32, i32, i32); // Tuple Struct

struct GecerliVeri;          // Unit-Like Struct

let siyah = Renk(0, 0, 0);


2. Metotlar: Yapılara Davranış Kazandırma​

Bir struct sadece veri tutmaz, aynı zamanda o veri üzerinde çalışan fonksiyonlara (metotlara) da sahip olabilir. Bunun için impl (implementation) bloğu kullanılır.

Kod:
struct Dikdortgen {

genislik: u32,

yukseklik: u32,

}

impl Dikdortgen {

// &self, bu metodun yapının kendisine eriştiğini belirtir

fn alan_hesapla(&self) -> u32 {

self.genislik * self.yukseklik

}

}


3. Enums (Numaralandırmalar): Olasılıkları Modelleme​

enum, bir değerin bir grup varyanttan biri olabileceğini belirtir. Rust’ın enum yapısı, diğer dillerden farklı olarak her bir varyantın içinde veri taşımasına izin verir. Bu, Rust’ı veri modellemede inanılmaz esnek kılar.

Kod:
enum Mesaj {

Cikis,                       // Veri yok

Yaz(String),                 // String taşıyor

Hareket { x: i32, y: i32 },  // Struct gibi veri taşıyor

RenkDegistir(i32, i32, i32), // Tuple gibi veri taşıyor

}

Enum ve Match Birlikteliği​

Enum'lar, match ifadesiyle birlikte kullanıldığında tam bir "su sızdırmaz" mantık kurmanızı sağlar.

Kod:
fn mesaj_isle(m: Mesaj) {

match m {

Mesaj::Cikis => println!("Oturum kapatılıyor."),

Mesaj::Yaz(s) => println!("Mesaj içeriği: {}", s),

Mesaj::Hareket { x, y } => println!("Koordinat: x={}, y={}", x, y),

_ => (), // Diğer durumları boş geç

}

}


4. Option Enum: Rust’ın Milyar Dolarlık Hataya Çözümü​

Birçok dilde bir değerin "yokluğu" null veya nil ile ifade edilir. Bu durum genellikle çalışma zamanı çökmelerine (NullPointerException) neden olur. Rust’ta null yoktur; bunun yerine standart kütüphanede tanımlı Option enum'u vardır.

Kod:
enum Option<T> {

Some(T),

None,

}

Eğer bir fonksiyon bir değer döndüremeyebilir ise, tipi Option&lt;i32&gt; olur. Derleyici, bu değeri kullanmadan önce None durumunu kontrol etmeniz için sizi zorlar. Bu, Rust’ın neden bu kadar güvenli olduğunun temel kanıtlarından biridir.


5. Struct ve Enum Kombinasyonu: Gerçek Dünya Örneği​

Bir e-ticaret sistemindeki ödeme yöntemlerini modelleyelim:

Kod:
struct OdemeBilgisi {

miktar: f64,

birim: String,

}

enum OdemeYontemi {

Nakit,

KrediKarti(String), // Kart numarası

Kripto(String),     // Cüzdan adresi

}

struct Islem {

bilgi: OdemeBilgisi,

yontem: OdemeYontemi,

}


Özet​

  • Structs: "Ve" (AND) ilişkisidir. Bir kullanıcı adı ve e-postası olan bir yapı oluşturursunuz.
  • Enums: "Veya" (OR) ilişkisidir. Ödeme nakit veya kredi kartı olabilir.
  • Metotlar: Veriyi işleyen mantığı verinin yanına (impl) koymanızı sağlar.
  • Güvenlik: Enum varyantlarını match ile kontrol etmek, hata payını sıfıra indirir.
Veri yapılarını doğru kurgulamak, Rust'ın "Ödünç Alma Denetçisi" (Borrow Checker) ile daha az kavga etmenizi sağlar. Kodunuz ne kadar iyi modellenirse, sahiplik kuralları o kadar doğal akar.
 
Geri
Üst