🚀 BAŞTAN SONA RUST DİLİ BÖLÜM-7: Enums, Option Tipi ve Pattern Matching (`match`) 🦀

Konu Özeti

Rust programlama dilinde enum yapıları, bir değerin olası varyantlarından yalnızca birini alabileceği türler olarak açıklanıyor. Her varyantın kendine ait veri ve tip taşıyabildiği, struct benzeri veya tuple benzeri alanlar içerebildiği vurgulanıyor. Rust'ta null yerine kullanılan Option tipi, Some ve None varyantlarıyla değerin varlığını veya yokluğunu güvenli şekilde temsil ediyor. Pattern matching için match operatörü, tüm varyantları eksiksiz ele alma zorunluluğuyla birlikte tanıtılıyor; if let yapısı ise tek bir varyantla ilgilenirken daha kısa sözdizimi sunuyor.

🚀 BAŞTAN SONA RUST DİLİ BÖLÜM-7: Enums, Option Tipi ve Pattern Matching (`match`) 🦀

Selamlar! Serimizin 7. bölümüne hoş geldiniz.

Önceki bölümde Struct yapılarını ve metot tanımlamayı görmüştük. Bu bölümde ise Rust’ın en güçlü ve özgün özelliklerinden birine geçiyoruz: **Enums (Numaralandırmalar)**, Rust'ın `null` yerine kullandığı **`Option<T>`** tipi ve kod akışını yönlendiren **`match` / `if let`** kalıpları!

---

📌 1. Enum (Enumeration) Nedir? 🎨

Enum, bir değerin olası varyantlarından (durumlarından) **yalnızca biri** olabileceğini ifade eden bir tiptir.

Struct'lar "X VE Y" şeklinde birden fazla alanı bir arada tutarken; Enum'lar "X VEYA Y" seçeneğini sunar.

enum IpAdresTipi {
V4,
V6,
}

fn main() {
let dort = IpAdresTipi::V4;
let alti = IpAdresTipi::V6;
}

---

💡 2. Enum Varyantlarına Veri Eklemek 📦

Rust'taki Enum'ları C/C++ veya Java'daki basit enum'lardan ayıran en büyük fark: **Her varyantın kendine ait verisi ve tipi olabilir!**

enum Mesaj {
Cikis, // Verisiz varyant
Yazi(String), // Tek bir String tutar
Tasi { x: i32, y: i32 }, // İsimlendirilmiş struct benzeri alan tutar
RenkDegistir(i32, i32, i32), // Tuple benzeri veri tutar
}

fn main() {
let m1 = Mesaj::Yazi(String::from("Selam Forum!"));
let m2 = Mesaj::Tasi { x: 10, y: 20 };
}

Tıpkı Struct'larda olduğu gibi Enum'lar için de `impl` bloğu yazıp metotlar ekleyebilirsiniz!

---

🚫 3. Rust'ta Neden `null` Yoktur? `Option<T>` Tipi 🛡️

Milyar dolarlık hata olarak bilinen `null` pointer kavramı Rust dilinde yoktur! Bir verinin "var veya yok" olma ihtimalini temsil etmek için standart kütüphanede `Option<T>` adı verilen bir Enum kullanılır.

`Option<T>` tanımı şu şekildedir:

enum Option<T> {
None, // Değer yok (Null yerine)
Some(T), // Değer var ve T tipinde
}

fn main() {
let bir_sayi = Some(5);
let bir_metin: Option<&str> = Some("Rust");

let yok_sayi: Option<i32> = None;
}

#### Neden Daha Güvenli?
Normal bir `i32` ile `Option<i32>` aynı tip değildir! Derleyici, içinde değer olmama ihtimali olan (`Option`) bir değişkeni kontrol etmeden doğrudan işlem yapmanıza izin vermez. Bu da NullPointerException hatalarını tamamen ortadan kaldırır.

---

🎯 4. Pattern Matching: `match` Operatörü 🧩

`match`, bir Enum'ın hangi varyant olduğunu kontrol etmemizi ve içindeki veriyi çıkarmamızı (destructure) sağlayan çok güçlü bir kontrol akış operatörüdür.

enum MadeniPara {
BirKurus,
BesKurus,
OnKurus,
YirmibesKurus,
}

fn deger_don(para: MadeniPara) -> u8 {
match para {
MadeniPara::BirKurus => 1,
MadeniPara::BesKurus => 5,
MadeniPara::OnKurus => 10,
MadeniPara::YirmibesKurus => 25,
}
}

⚠️ **Eksiksizlik Kuralı (Exhaustive Match):** `match` bloğunda Enum'ın TÜM varyantlarını ele almak ZORUNDASINIZDIR. Bir varyantı unutursanız kod derlenmez!

### `Option<T>` İle `match` Kullanımı:

fn arti_bir(x: Option<i32>) -> Option<i32> {
match x {
None => None,
Some(i) => Some(i + 1),
}
}

fn main() {
let bes = Some(5);
let alti = arti_bir(bes);
let yok = arti_bir(None);
}

### Joker Deseni (`_` ve `other`):
Eğer sadece belirli durumlarla ilgilenip kalan her şeyi tek bir blokta toplamak istiyorsak `_` kullanırız:

let zar = 6;
match zar {
3 => println!("Özel ödül kazandınız!"),
7 => println!("Ücretsiz hak!"),
_ => println!("Pas, tekrar atın."), // Diğer tüm sayılar
}

---

👌 5. Pratik Akış Kontrolü: `if let` 🎛️

Eğer bir Enum'ın sadece TEK BİR varyantı ilgimizi çekiyorsa, `match` yazmak çok fazla boilerplate (uzun) kod oluşturabilir. Bunun yerine `if let` yapısı kullanılır.

// 'match' ile yazım:
let bazen_deger: Option<u8> = Some(7);
match bazen_deger {
Some(max) => println!("Maksimum değer: {}", max),
_ => (), // Kalan durumlar için boş işlem
}

// 'if let' ile daha kısa yazım:
if let Some(max) = bazen_deger {
println!("Maksimum değer: {}", max);
} else {
println!("Değer bulunamadı!");
}

---

📝 Bölüm Özeti ve Gelecek Bölüm 🔮

Bu bölümde Rust'ın veri modellemesindeki en esnek yapısı olan Enum'ları, `null` krizini çözen `Option<T>` tipini ve `match` pattern matching mekanizmasını gördük.

👉 **Bölüm 8'de Bizi Ne Bekliyor?**
• Hata Yönetimi (Error Handling) ⚠️
• Unrecoverable Errors (`panic!`)
• Recoverable Errors ve **`Result<T, E>`** Tipi
• Hata Yayma Operatörü: **`
?`** (Question Mark)

Sorularınızı konu altından iletebilirsiniz. Bir sonraki bölümde görüşmek üzere! 🦀✨

🔒 Bu içeriği görmek için giriş yapın

 
Yanıt yazmak için giriş yapmalısınız
Forum özelliklerini kullanmak ve Level 2 üyelik satın almak için hesabınıza giriş yapın.
135,050Konular
3,297,703Mesajlar
326,233Kullanıcılar
membiSon Üye
Üst Alt