CodeBlanks Logo Icon CodeBlanks

Komut okuma

std::env::args ile komut satırı argümanlarını okursun.

Komut okuma

Gerçek bir CLI'da komutlar program argümanlarından gelir: cargo run -- ekle "Süt al". std::env::args() ilk eleman olarak program yolunu verir:

let args: Vec<String> = std::env::args().collect();
match args.get(1).map(|s| s.as_str()) {
    Some("ekle") => { /* args[2] */ }
    Some("liste") => { /* ... */ }
    _ => println!("Kullanım: todo <ekle|liste|bitir>"),
}

Alıştırmada komutları bir dizi içinde vereceğiz; her komutu split_once(' ') ile ad ve argümana ayıracağız.

Komutları eşlemek

"liste" gibi argümansız komutlarda boşluk yoktur; unwrap_or((k, "")) ile tüm metni ad, argümanı boş kabul ederiz. Ardından ad üzerinden match:

for k in komutlar {
    let (ad, arg) = k.split_once(' ').unwrap_or((k, ""));
    match ad {
        "ekle" => { liste.ekle(arg); }
        "bitir" => { /* arg.parse() */ }
        "liste" => liste.listele(),
        _ => println!("Bilinmeyen komut: {ad}"),
    }
}

Uygulama Komut işleyici

["ekle Süt al", "ekle Kod yaz", "bitir 1", "liste", "sil 3"] komutlarını sırayla işle. ekle, bitir (kimliği parse et) ve liste komutlarını desteklediğin metotlarla çalıştır; diğerleri için Bilinmeyen komut: AD 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 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,
    };
    let komutlar = ["ekle Süt al", "ekle Kod yaz", "bitir 1", "liste", "sil 3"];
    for k in komutlar {
        let (ad, arg) = k.split_once(' ').unwrap_or((k, ""));
        match ad {
            "ekle" => {
                liste.ekle(arg);
            }
            "bitir" => {
                let tamam = arg.parse().map(|id| liste.tamamla(id)).unwrap_or(false);
                if !tamam {
                    println!("Görev yok: {}", arg);
                }
            }
            "liste" => liste.listele(),
            _ => println!("Bilinmeyen komut: {}", ad),
        }
    }
}

Beklenen çıktı

[x] 1: Süt al
[ ] 2: Kod yaz
Bilinmeyen komut: sil

Soru ve cevaplar

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

1 <code>"bitir 1".split_once(' ')</code> ne döndürür?

  • ("bitir", "1")
  • None
  • Some(("bitir", "1")) Doğru cevap
  • ["bitir", "1"]

Açıklama: split_once ilk ayraçtan böler ve Option içinde bir ikili döndürür; ayraç yoksa None.

2 Ad ve argüman

Soru
let (ad, arg) = k.____(' ').unwrap_or((k, ""));
Cevap
let (ad, arg) = k.split_once(' ').unwrap_or((k, ""));

Açıklama: split_once metni ilk boşluktan iki parçaya böler.

3 Komut ve işlem

Kavram Anlamı
ekle Süt al Görev ekler
bitir 1 1 numarayı işaretler
liste Listeyi yazar
sil 3 Bilinmeyen komut

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