CodeBlanks Logo Icon CodeBlanks

Borrowing kuralları

Aynı anda birden fazla referans alma kurallarını öğrenirsin.

Borrowing kuralları

Herhangi bir anda bir değer için şunlardan yalnızca biri doğru olabilir:

  • istediğin kadar &T (okuyucu), ya da
  • tek bir &mut T (yazıcı).
let mut v = vec![1, 2, 3];
let ilk = &v[0];        // okuyucu
// v.push(4);           // hata E0502: okuyucu varken yazılamaz
println!("{ilk}");
v.push(4);              // ilk artık kullanılmıyor, sorun yok

Bu kural, vektör büyürken yeni belleğe taşınıp eski adresi gösteren referansın geçersiz kalmasını önler.

Hatayı çözmek

Bu tür hataların çözümü genellikle şunlardan biridir: referansın kullanımını değişiklikten önce bitirmek, değeri kopyalamak (let ilk = v[0]; i32 için Copy) ya da işlemleri ayırmak:

let mut v = vec![1, 2, 3];
let ilk = v[0];          // kopya, referans değil
v.push(ilk * 10);
println!("{:?}", v);     // [1, 2, 3, 10]

Uygulama İlk elemanı çoğalt

let mut v = vec![1, 2, 3]; tanımla. İlk elemanı kopyalayarak al (let ilk = v[0];), ardından v.push(ilk * 10); yap ve {:?} ile yazdır.

Başlangıç kodu

main.rs
fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
fn main() {
    let mut v = vec![1, 2, 3];
    let ilk = v[0];
    v.push(ilk * 10);
    println!("{:?}", v);
}

Beklenen çıktı

[1, 2, 3, 10]

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Yukarıdaki örnekte <code>v.push(4)</code> neden ilk satırda hata verirdi?

  • push yeni belleğe taşıyabilir ve ilk geçersiz bir adrese bakardı Doğru cevap
  • v değiştirilemez
  • 4 yanlış tür
  • Hata vermezdi

Açıklama: Kapasite dolunca vektör yeni bir dizi ayırıp elemanları taşır; borrow checker bu "kullanımdan sonra serbest bırakma" hatasını derlemede yakalar.

2 Kopyayla çöz

Soru
let mut v = vec![5, 6];
let ilk = ____;   // referans değil
v.push(ilk);
Cevap
let mut v = vec![5, 6];
let ilk = v[0];   // referans değil
v.push(ilk);

Açıklama: v[0] i32 için bir kopya üretir; böylece v değiştirilebilir.

3 Durum ve sonuç

Kavram Anlamı
&v + &v İzin verilir
&mut v + &mut v E0499
&v + v.push() E0502
let x = v[0]; v.push() İzin verilir (kopya)

Başlangıç bölümündeki tüm dersler

16 Proje: Yapılacaklar listesi

  1. Görev modeli
  2. Ekleme
  3. Listeleme
  4. İşaretleme
  5. Komut okuma