-
Sadrazamv4
ig:sadrazam_v4 tg: Sadrazam.spy
🚀 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! 🦀✨
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