Komut okuma
- Rust kursu
- Başlangıç
- Ders 93/115
- 6 dk
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
struct Gorev {
id: u32,
metin: String,
bitti: bool,
}
struct Liste {
gorevler: Vec<Gorev>,
sonraki_id: u32,
}
fn main() {
// buraya yaz
}Örnek çözüm
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
let (ad, arg) = k.____(' ').unwrap_or((k, ""));
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 |