CodeBlanks Logo Icon CodeBlanks

Ekleme

Vec<Todo>'ya yeni görev ekleyen fonksiyon yazarsın.

Ekleme

Görevleri bir Liste struct'ında toplayalım. Yeni görevlere artan kimlik vermek için son kullanılan kimliği de saklıyoruz:

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
    }
}

ekle listeyi değiştirdiği için &mut self alır ve yeni görevin kimliğini döndürür.

Kurucu

Boş bir liste oluşturmayı kolaylaştırmak için bir new ilişkili fonksiyonu yazılabilir:

impl Liste {
    fn new() -> Self {
        Self { gorevler: Vec::new(), sonraki_id: 0 }
    }
}

let mut liste = Liste::new();
let id = liste.ekle("Süt al");   // 1

Liste değiştirileceği için değişken let mut ile tanımlanır.

Uygulama Görev ekle

Liste için fn new() -> Self ve fn ekle(&mut self, metin: &str) -> u32 yaz. "Süt al" ve "Kod yaz" görevlerini ekle; listedeki görev sayısını ve son eklenen kimliği boşlukla yazdır.

Başlangıç kodu

main.rs
struct Gorev {
    id: u32,
    metin: String,
    bitti: bool,
}

struct Liste {
    gorevler: Vec<Gorev>,
    sonraki_id: u32,
}

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
struct Gorev {
    id: u32,
    metin: String,
    bitti: bool,
}

struct Liste {
    gorevler: Vec<Gorev>,
    sonraki_id: u32,
}

impl Liste {
    fn new() -> Self {
        Self {
            gorevler: Vec::new(),
            sonraki_id: 0,
        }
    }
    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 main() {
    let mut liste = Liste::new();
    liste.ekle("Süt al");
    let son = liste.ekle("Kod yaz");
    println!("{} {}", liste.gorevler.len(), son);
}

Beklenen çıktı

2 2

Soru ve cevaplar

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

1 <code>ekle</code> neden <code>metin: &amp;str</code> alıp içeride <code>to_string()</code> yapıyor?

  • to_string zorunludur
  • Çağıran hem sabit metin hem String verebilsin; görev ise kendi kopyasına sahip olsun Doğru cevap
  • &str daha hızlı yazdırılır
  • String parametre alınamaz

Açıklama: Parametrede esnek &str, saklarken sahip olunan String: yaygın bir Rust deseni.

2 Vektöre ekle

Soru
self.gorevler.____(Gorev {
    id: self.sonraki_id,
    metin: metin.to_string(),
    bitti: false,
});
Cevap
self.gorevler.push(Gorev {
    id: self.sonraki_id,
    metin: metin.to_string(),
    bitti: false,
});

Açıklama: Vec'in sonuna eleman eklemek için push kullanılır.

3 Parça ve görevi

Kavram Anlamı
Vec<Gorev> Görevleri tutar
sonraki_id Son kimlik
&mut self Listeyi değiştirir
Liste::new() Boş liste

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