CodeBlanks Logo Icon CodeBlanks

&mut self

&mut self ile struct'ı değiştiren metotlar tanımlarsın.

&mut self

Örneğin alanlarını değiştiren metotlar &mut self alır. Böyle bir metot yalnızca mut bir değişken üzerinde çağrılabilir:

struct Sayac { deger: u32, adim: u32 }

impl Sayac {
    fn artir(&mut self) {
        self.deger += self.adim;
    }
    fn sifirla(&mut self) {
        self.deger = 0;
    }
}

let s = Sayac { .. }; s.artir(); yazmak E0596 hatasıdır: "cannot borrow as mutable".

Zincirleme

&mut self metodu &mut Self döndürürse çağrılar zincirlenebilir:

impl Sayac {
    fn ekle(&mut self, n: u32) -> &mut Self {
        self.deger += n;
        self
    }
}

let mut s = Sayac { deger: 0, adim: 1 };
s.ekle(2).ekle(3);
println!("{}", s.deger);   // 5

Bu desen yapılandırma nesnelerinde (builder) sık görülür.

Uygulama Adımlı sayaç

Sayac { deger: u32, adim: u32 } için fn artir(&mut self) (deger += adim) ve fn sifirla(&mut self) yaz. deger: 0, adim: 5 ile başla, iki kez artır ve değeri yazdır; sonra sıfırla ve yine yazdır (tek satırda, boşlukla).

Başlangıç kodu

main.rs
struct Sayac {
    deger: u32,
    adim: u32,
}

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
struct Sayac {
    deger: u32,
    adim: u32,
}

impl Sayac {
    fn artir(&mut self) {
        self.deger += self.adim;
    }
    fn sifirla(&mut self) {
        self.deger = 0;
    }
}

fn main() {
    let mut s = Sayac { deger: 0, adim: 5 };
    s.artir();
    s.artir();
    let once = s.deger;
    s.sifirla();
    println!("{} {}", once, s.deger);
}

Beklenen çıktı

10 0

Soru ve cevaplar

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

1 <code>&amp;mut self</code> alan bir metot çağrılırken başka bir <code>&amp;s</code> referansı yaşıyorsa ne olur?

  • Çalışma anında panic
  • Referans otomatik kopyalanır
  • Derleme hatası: aynı anda okuyucu ve yazıcı olamaz Doğru cevap
  • Sorun olmaz

Açıklama: Metot çağrısı da bir ödünç almadır; ödünç alma kuralları aynen geçerlidir.

2 Değiştiren metot

Soru
fn sifirla(____) {
    self.deger = 0;
}
Cevap
fn sifirla(&mut self) {
    self.deger = 0;
}

Açıklama: Alan değiştirmek için değiştirilebilir ödünç gerekir.

3 Kod ve sonuç

Kavram Anlamı
let s; s.artir() E0596
let mut s; s.artir() Çalışır
-> &mut Self Zincirleme
self.deger = 0 Alan atama

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