Borrowing & References: Veriyi Kopyalamadan Ödünç Alma Kuralları

  • Konbuyu başlatan Konbuyu başlatan irfo
  • Başlangıç tarihi Başlangıç tarihi

irfo

Moderatör
Top Poster Of Month
Katılım
7 Ocak 2026
Mesajlar
290
Tepkime puanı
2
Puanları
18
Sahiplik (Ownership) sistemi çok güçlüdür, ancak her fonksiyon çağırdığımızda verinin sahipliğini devretmek ve sonra geri almak oldukça zahmetlidir. Rust, bu sorunu References (Referanslar) ve Borrowing (Ödünç Alma) mekanizmasıyla çözer.
Referanslar, verinin sahipliğini devralmadan ona erişmenizi sağlayan bir nevi "bakış" veya "işaretçi"dir.

1. Referanslar (&)​

Bir değerin referansını oluşturduğunuzda, ona sahip olmazsınız. Sadece nerede olduğunu bilirsiniz. Bu sayede veri, kapsam dışına çıktığında yok edilmez; çünkü asıl sahibi hala başka bir değişkendir.
Rust
Kod:
fn main() {
    let s1 = String::from("merhaba");
    
    // &s1 ile sahipliği devretmiyoruz, sadece ödünç veriyoruz
    let uzunluk = uzunluk_hesapla(&s1); 

    println!("'{}' kelimesinin uzunluğu: {}", s1, uzunluk);
}

fn uzunluk_hesapla(s: &String) -> usize { // s bir referanstır
    s.len()
} // s kapsam dışına çıkar ama işaret ettiği veri silinmez

2. Değiştirilebilir Referanslar (&mut)​

Varsayılan olarak referanslar immutable (değiştirilemez) haldedir. Ödünç aldığınız bir kitabı karalayamazsınız. Eğer veriyi değiştirmek istiyorsanız, hem değişkenin kendisi mut olmalı hem de referansı &mut olarak oluşturmalısınız.
Rust
Kod:
let mut s = String::from("merhaba");

metni_degistir(&mut s);

fn metni_degistir(s: &mut String) {
    s.push_str(", dünya");
}

3. Ödünç Alma Kuralları (Borrowing Rules)​

Rust, bellek güvenliğini ve veri yarışlarını (data races) önlemek için referanslara çok katı iki kural koyar:
  1. Aynı anda ya bir adet değiştirilebilir (&mut) referansınız olabilir ya da dilediğiniz kadar salt okunur (&) referansınız.
  2. Referanslar her zaman geçerli bir veriyi işaret etmelidir.

Neden Aynı Anda İki &mut Yasak?​

Eğer iki farklı kod parçası aynı anda aynı veriyi değiştirmeye çalışırsa, bu durum "veri yarışına" yol açar ve programın davranışını tahmin edilemez kılar. Rust bunu derleme aşamasında engelleyerek çalışma zamanı hatalarını sıfıra indirir.

4. Askıda Kalmış Referanslar (Dangling References)​

Rust, bir verinin bellekten silindikten sonra ona işaret eden bir referansın kalmasına asla izin vermez.
Rust
Kod:
fn main() {
    let referans_mi = salla();
}

fn salla() -> &String { // HATA!
    let s = String::from("merhaba");
    &s 
} // s burada yok edilir, ama biz onun adresini döndürmeye çalışıyoruz.

Özet​

ÖzellikImmutable Reference (&T)Mutable Reference (&mut T)
Erişim TürüSadece OkumaOkuma ve Yazma
Sayı SınırıSınırsızSadece 1 adet
Birlikte KullanımDiğer &T'lerle olabilirBaşka hiçbir referansla olamaz
 
Geri
Üst