CodeBlanks Logo Icon CodeBlanks

Vec ile durum

Vec ile uygulama durumunu tutarsın.

Vec ile durum

Notları bellekte bir Vec<String> içinde tutan bir Defter türü yazalım. Kullanıcıya numaralar 1'den başlayarak gösterilir:

struct Defter {
    notlar: Vec<String>,
}

impl Defter {
    fn ekle(&mut self, metin: String) {
        self.notlar.push(metin);
    }
    fn liste(&self) -> Vec<String> {
        self.notlar.iter().enumerate()
            .map(|(i, n)| format!("{}. {}", i + 1, n))
            .collect()
    }
}

liste yazdırmak yerine satırları döndürür; böylece çıktı test edilebilir ve başka yerlerde de kullanılabilir.

Argümanları birleştirmek

not ekle süt al komutunda metin birden çok argümana bölünür; join(" ") ile tek metne birleştirilir:

let args = ["not", "ekle", "süt", "al"];
let metin = args[2..].join(" ");   // "süt al"

Dilim [2..], komut adından sonraki tüm argümanları verir.

Uygulama Not ekle ve listele

Defter'e liste metodunu ekle. ["not", "ekle", "süt", "al"] argümanlarından metni join ile oluşturup ekle, ardından "kod yaz" ekle; liste() satırlarını yazdır.

Başlangıç kodu

main.rs
struct Defter {
    notlar: Vec<String>,
}

impl Defter {
    fn new() -> Self {
        Self { notlar: Vec::new() }
    }
    fn ekle(&mut self, metin: String) {
        self.notlar.push(metin);
    }
}

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
struct Defter {
    notlar: Vec<String>,
}

impl Defter {
    fn new() -> Self {
        Self { notlar: Vec::new() }
    }
    fn ekle(&mut self, metin: String) {
        self.notlar.push(metin);
    }
}

impl Defter {
    fn liste(&self) -> Vec<String> {
        self.notlar
            .iter()
            .enumerate()
            .map(|(i, n)| format!("{}. {}", i + 1, n))
            .collect()
    }
}

fn main() {
    let mut d = Defter::new();
    let args = ["not", "ekle", "süt", "al"];
    d.ekle(args[2..].join(" "));
    d.ekle(String::from("kod yaz"));
    for s in d.liste() {
        println!("{}", s);
    }
}

Beklenen çıktı

1. süt al
2. kod yaz

Soru ve cevaplar

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

1 Gerçek bir CLI'da notlar program kapanınca kaybolur. Bunu çözmenin yolu nedir?

  • Vec yerine HashMap
  • Çözülemez
  • Durumu dosyaya kaydedip açılışta okumak Doğru cevap
  • static değişken kullanmak

Açıklama: Dosya I/O ve serde derslerinde notları JSON olarak saklayacağız.

2 Numaralı satırlar

Soru
self.notlar.iter().____()
    .map(|(i, n)| format!("{}. {}", i + 1, n))
Cevap
self.notlar.iter().enumerate()
    .map(|(i, n)| format!("{}. {}", i + 1, n))

Açıklama: enumerate her nota 0'dan başlayan sırasını ekler.

3 İfade ve sonuç

Kavram Anlamı
args[2..].join(" ") "süt al"
notlar.len() Not sayısı
(0, "a") → format "1. a"
Defter::new() Boş defter

Orta seviye bölümündeki tüm dersler