Rust
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.
Ö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,
};
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),
}
}
}
Kendini test et
-
<code>"bitir 1".split_once(' ')</code> ne döndürür?
- ("bitir", "1")
- None
- Some(("bitir", "1"))
- ["bitir", "1"]
Cevabı göster
Some(("bitir", "1")) — split_once ilk ayraçtan böler ve Option içinde bir ikili döndürür; ayraç yoksa None.
-
Ad ve argüman
let (ad, arg) = k.____(' ').unwrap_or((k, ""));
Cevabı göster
let (ad, arg) = k.split_once(' ').unwrap_or((k, ""));
-
Komut ve işlem
- ekle Süt al
- Görev ekler
- bitir 1
- 1 numarayı işaretler
- liste
- Listeyi yazar
- sil 3
- Bilinmeyen komut
Sıradaki ders: Vec<T> tanımı