&mut self
- Rust kursu
- Başlangıç
- Ders 73/115
- 4 dk
&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); // 5Bu 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
struct Sayac {
deger: u32,
adim: u32,
}
fn main() {
// buraya yaz
}Örnek çözüm
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>&mut self</code> alan bir metot çağrılırken başka bir <code>&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
fn sifirla(____) {
self.deger = 0;
}
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 |