-
Sadrazamv4
ig:sadrazam_v4 tg: Sadrazam.spy
🚀 BAŞTAN SONA RUST DİLİ BÖLÜM-5: Borrowing (Ödünç Alma), References ve Slices 🦀
Selamlar! Serimizin 5. bölümüne hoş geldiniz.
Geçen bölümde Rust'ın kalbi olan Ownership (Sahiplik) sistemini incelemiştik. Bir veriyi fonksiyona her gönderdiğimizde sahipliğin devredildiğini (Move) ve orijinal değişkenin kullanılmaz hale geldiğini gördük.
Peki, sahipliği devretmeden bir veriyi sadece okumak veya değiştirmek istersek ne yapacağız? İşte burada devreye **Borrowing (Ödünç Alma)** ve **References (Referanslar)** giriyor!
---
📌 1. Referanslar ve Ödünç Alma (Borrowing) 🔗
Sahipliği devretmek yerine, verinin adresini (pointer) fonksiyona geçici olarak vermeye **Borrowing** denir. Referans oluşturmak için `&` sembolü kullanılır.
fn main() {
let s1 = String::from("Merhaba Rust");
// s1'in sahipliğini vermiyoruz, sadece referansını (&s1) gönderiyoruz:
let uzunluk = uzunluk_hesapla(&s1);
// s1 halen geçerli ve kullanılabilir!
println!("'{}' metninin uzunluğu: {}", s1, uzunluk);
}
fn uzunluk_hesapla(s: &String) -> usize { // s, String'in bir referansıdır
s.len()
} // s burada scope dışına çıkar ama referans olduğu için Heap'teki asıl veri SILINMEZ!
Referanslar varsayılan olarak **Immutable (Değiştirilemez)** yapıdadır. Yani `&s` ile aldığınız bir veriyi fonksiyon içinde değiştiremezsiniz!
---
✏️ 2. Değiştirilebilir Referanslar (Mutable References) 🛠️
Eğer ödünç aldığımız veriyi değiştirmek istiyorsak `&mut` kullanırız. Bunun için orijinal değişkenin de `mut` olması gerekir.
fn main() {
let mut s = String::from("Merhaba");
metni_degistir(&mut s);
println!("{}", s); // Çıktı: "Merhaba Forum"
}
fn metni_degistir(s: &mut String) {
s.push_str(" Forum");
}
---
🚨 3. Borrowing Sisteminin 2 Altın Kuralı 🛑
Rust, Data Race (Veri Yarışı) durumlarını önlemek için derleme zamanında (compile-time) çok katı iki kural uygular:
1. Aynı anda bir veri için **istediğiniz kadar immutable referans (`&T`)** oluşturabilirsiniz.
2. Ancak aynı anda aynı veri için **sadece TEK BİR mutable referans (`&mut T`)** oluşturabilirsiniz!
fn main() {
let mut s = String::from("Test");
let r1 = &s; // Problem yok
let r2 = &s; // Problem yok
println!("{} ve {}", r1, r2);
let mut_ref = &mut s; // HATA! Aynı anda hem okuma hem yazma referansı olamaz!
// println!("{}, {}", r1, mut_ref);
}
💡 **Neden bu kural var?**
Eğer bir yer veriyi okurken başka bir yer aynı anda o veriyi değiştiriyorsa "Data Race" oluşur. Rust bunu derleme aşamasında engelleyerek çalışma zamanı çökmelerinin önüne geçer!
---
👻 4. Dangling References (Sallanan Referanslar) ⚠️
C/C++ gibi dillerde sıkça karşılaşılan, bellekten silinmiş bir adresi gösteren pointer (dangling pointer) hatası Rust'ta **imkansızdır**.
fn main() {
let referans_boşta = sallanan_referans();
}
/*
fn sallanan_referans() -> &String {
let s = String::from("Geçici");
&s // HATA! s fonksiyon bitince bellekten silinecek, adresi geriye dönemezsiniz!
}
*/
Derleyici buna geçit vermez ve kodunuz derlenmez.
---
✂️ 5. Slice Tipi (`&str` ve `&[T]`) 🍕
Slice (Dilim), bir koleksiyonun tamamına değil, bitişik bir bölümüne referans vermemizi sağlar. Sahiplik almaz.
### A. String Slices (`&str`)
Bir `String`'in belirli bir aralığını almak için kullanılır:
fn main() {
let s = String::from("Rust Dili");
let rust = &s[0..4]; // "Rust" (0, 1, 2, 3. indeksler)
let dili = &s[5..9]; // "Dili"
println!("{} - {}", rust, dili);
}
> **Not:** `&str` (string slice) immutable bir referanstır. Kodlarımıza tırnak içinde yazdığımız literal metinler (`let x = "Selam"`) de aslında birer `&str`'dir!
### B. Array Slices
Aynı mantık diziler (array) için de geçerlidir:
fn main() {
let a = [10, 20, 30, 40, 50];
let dilim: &[i32] = &a[1..4]; // [20, 30, 40] elemanlarını kapsar
assert_eq!(dilim, &[20, 30, 40]);
}
---
📝 Bölüm Özeti ve Gelecek Bölüm 🔮
Bu bölümde Rust'ın bellek güvenliğinin ikinci büyük sütunu olan Borrowing (Ödünç Alma) kurallarını, Mutable/Immutable referans sınırlarını ve Slice yapılarını gördük.
👉 **Bölüm 6'da Bizi Ne Bekliyor?**
• Verileri Gruplama: **Structs (Yapılar)**
• Struct Tanımlama ve Instantiating
• Metotlar ve `im
pl` Blokları (`self`, `&self`, `&mut self`)
Sorularınızı konu altından iletebilirsiniz. Bir sonraki bölümde görüşmek üzere! 🦀✨
Selamlar! Serimizin 5. bölümüne hoş geldiniz.
Geçen bölümde Rust'ın kalbi olan Ownership (Sahiplik) sistemini incelemiştik. Bir veriyi fonksiyona her gönderdiğimizde sahipliğin devredildiğini (Move) ve orijinal değişkenin kullanılmaz hale geldiğini gördük.
Peki, sahipliği devretmeden bir veriyi sadece okumak veya değiştirmek istersek ne yapacağız? İşte burada devreye **Borrowing (Ödünç Alma)** ve **References (Referanslar)** giriyor!
---
📌 1. Referanslar ve Ödünç Alma (Borrowing) 🔗
Sahipliği devretmek yerine, verinin adresini (pointer) fonksiyona geçici olarak vermeye **Borrowing** denir. Referans oluşturmak için `&` sembolü kullanılır.
fn main() {
let s1 = String::from("Merhaba Rust");
// s1'in sahipliğini vermiyoruz, sadece referansını (&s1) gönderiyoruz:
let uzunluk = uzunluk_hesapla(&s1);
// s1 halen geçerli ve kullanılabilir!
println!("'{}' metninin uzunluğu: {}", s1, uzunluk);
}
fn uzunluk_hesapla(s: &String) -> usize { // s, String'in bir referansıdır
s.len()
} // s burada scope dışına çıkar ama referans olduğu için Heap'teki asıl veri SILINMEZ!
Referanslar varsayılan olarak **Immutable (Değiştirilemez)** yapıdadır. Yani `&s` ile aldığınız bir veriyi fonksiyon içinde değiştiremezsiniz!
---
✏️ 2. Değiştirilebilir Referanslar (Mutable References) 🛠️
Eğer ödünç aldığımız veriyi değiştirmek istiyorsak `&mut` kullanırız. Bunun için orijinal değişkenin de `mut` olması gerekir.
fn main() {
let mut s = String::from("Merhaba");
metni_degistir(&mut s);
println!("{}", s); // Çıktı: "Merhaba Forum"
}
fn metni_degistir(s: &mut String) {
s.push_str(" Forum");
}
---
🚨 3. Borrowing Sisteminin 2 Altın Kuralı 🛑
Rust, Data Race (Veri Yarışı) durumlarını önlemek için derleme zamanında (compile-time) çok katı iki kural uygular:
1. Aynı anda bir veri için **istediğiniz kadar immutable referans (`&T`)** oluşturabilirsiniz.
2. Ancak aynı anda aynı veri için **sadece TEK BİR mutable referans (`&mut T`)** oluşturabilirsiniz!
fn main() {
let mut s = String::from("Test");
let r1 = &s; // Problem yok
let r2 = &s; // Problem yok
println!("{} ve {}", r1, r2);
let mut_ref = &mut s; // HATA! Aynı anda hem okuma hem yazma referansı olamaz!
// println!("{}, {}", r1, mut_ref);
}
💡 **Neden bu kural var?**
Eğer bir yer veriyi okurken başka bir yer aynı anda o veriyi değiştiriyorsa "Data Race" oluşur. Rust bunu derleme aşamasında engelleyerek çalışma zamanı çökmelerinin önüne geçer!
---
👻 4. Dangling References (Sallanan Referanslar) ⚠️
C/C++ gibi dillerde sıkça karşılaşılan, bellekten silinmiş bir adresi gösteren pointer (dangling pointer) hatası Rust'ta **imkansızdır**.
fn main() {
let referans_boşta = sallanan_referans();
}
/*
fn sallanan_referans() -> &String {
let s = String::from("Geçici");
&s // HATA! s fonksiyon bitince bellekten silinecek, adresi geriye dönemezsiniz!
}
*/
Derleyici buna geçit vermez ve kodunuz derlenmez.
---
✂️ 5. Slice Tipi (`&str` ve `&[T]`) 🍕
Slice (Dilim), bir koleksiyonun tamamına değil, bitişik bir bölümüne referans vermemizi sağlar. Sahiplik almaz.
### A. String Slices (`&str`)
Bir `String`'in belirli bir aralığını almak için kullanılır:
fn main() {
let s = String::from("Rust Dili");
let rust = &s[0..4]; // "Rust" (0, 1, 2, 3. indeksler)
let dili = &s[5..9]; // "Dili"
println!("{} - {}", rust, dili);
}
> **Not:** `&str` (string slice) immutable bir referanstır. Kodlarımıza tırnak içinde yazdığımız literal metinler (`let x = "Selam"`) de aslında birer `&str`'dir!
### B. Array Slices
Aynı mantık diziler (array) için de geçerlidir:
fn main() {
let a = [10, 20, 30, 40, 50];
let dilim: &[i32] = &a[1..4]; // [20, 30, 40] elemanlarını kapsar
assert_eq!(dilim, &[20, 30, 40]);
}
---
📝 Bölüm Özeti ve Gelecek Bölüm 🔮
Bu bölümde Rust'ın bellek güvenliğinin ikinci büyük sütunu olan Borrowing (Ödünç Alma) kurallarını, Mutable/Immutable referans sınırlarını ve Slice yapılarını gördük.
👉 **Bölüm 6'da Bizi Ne Bekliyor?**
• Verileri Gruplama: **Structs (Yapılar)**
• Struct Tanımlama ve Instantiating
• Metotlar ve `im
pl` Blokları (`self`, `&self`, `&mut self`)
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