🚀 BAŞTAN SONA RUST DİLİ BÖLÜM-9: Yaygın Koleksiyonlar (Vectors, Strings, HashMaps) 📦

Konu Özeti

Rust programlama dilinde yaygın koleksiyonlar olan Vector, String ve HashMap yapılarının kullanımı detaylandırılıyor. Vector ile dinamik dizi oluşturma, eleman ekleme ve güvenli erişim yöntemleri, String ile UTF-8 metin işleme ve birleştirme, HashMap ile anahtar-değer eşleştirme ve güncelleme stratejileri örneklerle açıklanıyor. Ayrıca String indeksleme kısıtlaması ve HashMap'te entry API kullanımı gibi önemli noktalara değiniliyor.

🚀 BAŞTAN SONA RUST DİLİ BÖLÜM-9: Yaygın Koleksiyonlar (Vectors, Strings, HashMaps) 📦

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

Önceki bölümde Rust'ın hata yönetimi felsefesini, `panic!` ve `Result<T, E>` yapılarını görmüştük. Bu bölümde ise çalışma zamanında (runtime) dinamik olarak büyüyüp küçülebilen, verileri Heap bellekte saklayan **Yaygın Koleksiyonları (Common Collections)** inceleyeceğiz.

Kullanacağımız ana koleksiyonlar şunlardır:
1. **Vector (`Vec<T>`):** Yan yana bitişik değerler listesi.
2. **String:** UTF-8 kodlanmış karakterler *****.
3. **HashMap (`HashMap<K, V>`):** Anahtar-değer (Key-Value) çiftlerini saklayan yapı.

---

📐 1. Vector (`Vec<T>`) 🧬

Vector, aynı tipten birden fazla değeri bellekte ardışık olarak tutan dinamik bir dizidir. Boyutu derleme zamanında sabit olmak zorunda değildir.

### Vector Oluşturma ve Eleman Ekleme:

fn main() {
// 1. Yol: Boş vector oluşturup eleman ekleme (mut olmalı!)
let mut v1: Vec<i32> = Vec::new();
v1.push(5);
v1.push(6);
v1.push(7);

// 2. Yol: vec! makrosu ile hızlıca oluşturma (Tip çıkarımı yapılır)
let v2 = vec![1, 2, 3, 4, 5];
}

### Vector Elemanlarına Erişim:
Vector elemanlarına iki farklı yolla erişilebilir:

fn main() {
let v = vec![10, 20, 30, 40, 50];

// Yol A: Indeks İle Erişim (Sınır aşılırsa PANIC verir!)
let ucuncu: &i32 = &v[2];
println!("3. eleman: {}", ucuncu);

// Yol B: .get() Metodu İle Erişim (Güvenli - Option döner)
match v.get(2) {
Some(deger) => println!("3. eleman: {}", deger),
None => println!("Böyle bir indeks yok!"),
}
}

### Vector Üzerinde Döngü Kurmak:

fn main() {
let mut v = vec![100, 32, 57];

// Immutable döngü
for i in &v {
println!("{}", i);
}

// Mutable döngü (Elemanları değiştirmek için dereference '*' kullanılır)
for i in &mut v {
*i += 50;
}
}

---

🔤 2. String Derinlemesine 🧵

Rust çekirdeğinde (core) sadece `&str` (string slice) tipi vardır. Standart kütüphane ise dinamik, heap-allocated ve büyütülebilir `String` tipini sunar. Her iki tip de **UTF-8** kodlamalıdır.

### String Oluşturma ve Güncelleme:

fn main() {
let mut s = String::from("Foo");
s.push_str("bar"); // &str ekleme
s.push('!'); // Tek bir char ekleme

println!("{}", s); // "Foobar!"
}

### String Bireşimi (Concatenation):
`+` operatörü veya `format!` makrosu kullanılır:

fn main() {
let s1 = String::from("Hello, ");
let s2 = String::from("world!");

// + operatörü: ilk metnin sahipliğini (ownership) alır!
let s3 = s1 + &s2; // s1 move edildi, s2'nin referansı kullanıldı.

// format! makrosu: Sahiplik ALMAZ, daha okunaklıdır.
let m1 = String::from("Tic");
let m2 = String::from("Tac");
let m3 = String::from("Toe");

let s = format!("{}-{}-{}", m1, m2, m3);
println!("{}", s);
}

⚠️ **String Indeksleme Uyarısı:** Rust'ta `s[0]` şeklinde String indeksleyemezsiniz! Çünkü UTF-8 karakterler bellekte 1 ila 4 byte arası yer kaplar. Indeks erişimi doğrudan byte sırasına denk geleceği için mantıksal hatalara yol açar.

---

🗺️ 3. HashMap (`HashMap<K, V>`) 🔑

HashMap, anahtarları (Key) değerlerle (Value) eşleştirerek saklar (`K` anahtar tipi, `V` değer tipi).

`HashMap` varsayılan prelud kapsamına dahil değildir, bu yüzden `use std::collections::HashMap;` ile projeye içe aktarılmalıdır.

### HashMap Oluşturma ve Eleman Ekleme:

use std::collections::HashMap;

fn main() {
let mut skorlar = HashMap::new();

skorlar.insert(String::from("Mavi Takım"), 10);
skorlar.insert(String::from("Sarı Takım"), 50);

// Değer Okuma (.get() Option döner)
let takim_adi = String::from("Mavi Takım");
let skor = skorlar.get(&takim_adi).copied().unwrap_or(0);
println!("{}: {}", takim_adi, skor);

// HashMap Üzerinde Döngü
for (key, value) in &skorlar {
println!("{}: {}", key, value);
}
}

### HashMap Güncelleme Stratejileri:

use std::collections::HashMap;

fn main() {
let mut skorlar = HashMap::new();

// 1. Üzerine Yazma (Overwriting)
skorlar.insert(String::from("Mavi"), 10);
skorlar.insert(String::from("Mavi"), 25); // Eski değer silinir, 25 olur

// 2. Sadece Değer Yoksa Ekleme (entry ve or_insert)
skorlar.entry(String::from("Sarı")).or_insert(50);
skorlar.entry(String::from("Sarı")).or_insert(100); // Sarı zaten var, 50 kalır

// 3. Eski Değere Göre Güncelleme (Örn: Kelime Sayacı)
let metin = "hello world wonderful world";
let mut harita = HashMap::new();

for kelime in metin.split_whitespace() {
let count = harita.entry(kelime).or_insert(0);
*count += 1; // Pointer üzerinden değeri 1 artırır
}

println!("{:?}", harita);
}

---

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

Bu bölümde Rust'ın dinamik bellek kullanan en önemli 3 koleksiyon yapısını (`Vec<T>`, `String`, `HashMap<K,V>`) ve bunların pratik kullanım detaylarını öğrendik.

👉 **Bölüm 10'da Bizi Ne Bekliyor?**
• Modül Sistemi ve Proje Organizasyonu (Packages, Crates, Modules)
• `use` anahtar kelimesi ve `pub
` (visibility) erişim düzenleyicisi
• Modülleri dosya ve klasörlere bölme

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.
136,612Threads
3,306,982Messages
328,455Members
yavuzdemirLatest member
Top Bottom