Rust
İşaretleme
Index ile bir görevi tamamlandı olarak işaretlersin.
İşaretleme
Bir görevi tamamlandı işaretlemek için kimliğine göre bulup alanını değiştirmemiz gerekir. iter_mut().find(..) eşleşen ilk elemana &mut referansı Option içinde verir:
fn tamamla(&mut self, id: u32) -> bool {
match self.gorevler.iter_mut().find(|g| g.id == id) {
Some(g) => {
g.bitti = true;
true
}
None => false,
}
}
Bulunamayan kimlik için false döndürmek, çağıranın kullanıcıya mesaj göstermesini sağlar.
if let ile kısaltma
Aynı metot if let ile daha kısa yazılabilir:
fn tamamla(&mut self, id: u32) -> bool {
if let Some(g) = self.gorevler.iter_mut().find(|g| g.id == id) {
g.bitti = true;
return true;
}
false
}
Silme için de benzer bir yöntem kullanılır: self.gorevler.retain(|g| g.id != id); eşleşmeyenleri tutar.
Uygulama Görevi tamamla
Liste'ye ekle, tamamla ve listele metotlarını yaz. İki görev ekle ("Süt al", "Kod yaz"), önce tamamla(2) ve tamamla(9) sonuçlarını boşlukla yazdır, sonra listeyi göster.
Örnek çözümü göster
struct Gorev {
id: u32,
metin: String,
bitti: bool,
}
struct Liste {
gorevler: Vec<Gorev>,
sonraki_id: u32,
}
impl Liste {
fn ekle(&mut self, metin: &str) -> u32 {
self.sonraki_id += 1;
self.gorevler.push(Gorev {
id: self.sonraki_id,
metin: metin.to_string(),
bitti: false,
});
self.sonraki_id
}
fn tamamla(&mut self, id: u32) -> bool {
match self.gorevler.iter_mut().find(|g| g.id == id) {
Some(g) => {
g.bitti = true;
true
}
None => false,
}
}
fn listele(&self) {
for g in &self.gorevler {
let isaret = if g.bitti { "x" } else { " " };
println!("[{}] {}: {}", isaret, g.id, g.metin);
}
}
}
fn main() {
let mut liste = Liste {
gorevler: Vec::new(),
sonraki_id: 0,
};
liste.ekle("Süt al");
liste.ekle("Kod yaz");
let a = liste.tamamla(2);
let b = liste.tamamla(9);
println!("{} {}", a, b);
liste.listele();
}
Kendini test et
-
Neden <code>self.gorevler[id as usize]</code> kullanmadık?
- İndeksleme Rust'ta yok
- Daha yavaş olurdu
- u32 indekslenemez
- Kimlikler indeksle aynı değil (1'den başlıyor, silme olursa kayar) ve yanlış kimlik panic verir
Cevabı göster
Kimlikler indeksle aynı değil (1'den başlıyor, silme olursa kayar) ve yanlış kimlik panic verir — Kimliğe göre aramak hem doğru hem güvenli; find yoksa None döner, panic olmaz.
-
Değiştirilebilir arama
match self.gorevler.____().find(|g| g.id == id) {
Some(g) => { g.bitti = true; true }
None => false,
}
Cevabı göster
match self.gorevler.iter_mut().find(|g| g.id == id) {
Some(g) => { g.bitti = true; true }
None => false,
}
-
Yöntem ve sonucu
- iter_mut().find(..)
- Option<&mut Gorev>
- retain(|g| g.id != 2)
- 2 silinir
- tamamla(9)
- false
- gorevler[9]
- Panic
Sıradaki ders: Komut okuma