-
Sadrazamv4
instagram:sadrazam.spy Tg:Sadrazamv4
🚀 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! 🦀✨
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