CodeBlanks Logo Icon CodeBlanks

Değiştirilebilir referans

&mut ile değiştirilebilir referans alırsın.

Değiştirilebilir referans

Ödünç alınan değeri değiştirmek için &mut kullanılır. Değişkenin kendisi de mut olmalıdır:

fn unlem_ekle(s: &mut String) {
    s.push('!');
}

let mut selam = String::from("Merhaba");
unlem_ekle(&mut selam);
println!("{selam}");   // Merhaba!

Sayılar gibi Copy türleri değiştirmek için referansı * ile çözersin: fn artir(n: &mut i32) { *n += 1; }.

Dışlayıcılık neden?

Bir değeri aynı anda iki yerden değiştirmek veri yarışına ve tutarsız duruma yol açar. Rust bunu derleme anında engeller:

let mut v = vec![1, 2];
let a = &mut v;
// let b = &mut v;   // hata E0499: ikinci &mut
a.push(3);
println!("{:?}", v);

Bu kural yalnızca referansların yaşadığı süre için geçerlidir; a son kez kullanıldıktan sonra yeni bir &mut alınabilir (non-lexical lifetimes).

Uygulama Sayaç artır

fn artir(n: &mut i32, adim: i32) fonksiyonu *n += adim yapsın. let mut sayac = 10; için iki kez artir(&mut sayac, 5) çağır ve sonucu yazdır.

Başlangıç kodu

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

Örnek çözüm

main.rs
fn artir(n: &mut i32, adim: i32) {
    *n += adim;
}

fn main() {
    let mut sayac = 10;
    artir(&mut sayac, 5);
    artir(&mut sayac, 5);
    println!("{}", sayac);
}

Beklenen çıktı

20

Soru ve cevaplar

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

1 Aynı anda kaç tane <code>&amp;mut</code> referans olabilir?

  • Hiç
  • Bir Doğru cevap
  • Sınırsız
  • İki

Açıklama: Değiştirilebilir referans dışlayıcıdır (exclusive): aynı anda yalnızca bir tane olabilir ve o sırada başka hiçbir referans bulunamaz.

2 Değeri değiştir

Soru
fn ikiye_katla(n: &mut i32) {
    ____n *= 2;
}
Cevap
fn ikiye_katla(n: &mut i32) {
    *n *= 2;
}

Açıklama: *n referansı çözer; değişiklik asıl değişkene yazılır.

3 Kod ve sonuç

Kavram Anlamı
&mut s Değiştirilebilir ödünç
*n += 1 Çözüp değiştirir
İki &mut aynı anda E0499
let s (mut yok) + &mut s Derleme hatası

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