Derive makrosu
- Rust kursu
- Orta seviye
- Ders 96/115
- 4 dk
#[derive(Parser)] ile argüman yapısı tanımlarsın.
Derive makrosu
clap'te struct alanları argümanlara dönüşür; belge yorumları (///) yardım metni olur, öznitelikler davranışı belirler:
/// Kullanıcıyı selamlar
#[derive(Parser)]
#[command(version, about)]
struct Args {
/// Selamlanacak kişi
#[arg(short, long)]
ad: String,
/// Kaç kez selamlanacak
#[arg(short, long, default_value_t = 1)]
tekrar: u32,
}short → -a, long → --ad. Alan türü dönüşümü belirler: u32 verilmişse "abc" girdisi otomatik hata verir.
Elle varsayılan ve dönüşüm
Aynı davranışı elle kurmak için her bayrak için bir yardımcı yazılabilir:
fn deger<'a>(args: &[&'a str], ad: &str) -> Option<&'a str> {
let i = args.iter().position(|a| *a == ad)?;
args.get(i + 1).copied()
}
let tekrar: u32 = match deger(args, "--tekrar") {
Some(s) => s.parse().map_err(|_| format!("--tekrar sayı olmalı: {s}"))?,
None => 1,
};Uygulama Tekrarlı selam
Yukarıdaki deger yardımcısıyla Args { ad: String, tekrar: u32 } ayrıştır; --tekrar yoksa 1 olsun. ["--ad", "Ece", "--tekrar", "3"] için Merhaba Ece satırını tekrar kez yazdır.
Başlangıç kodu
fn main() {
// buraya yaz
}Örnek çözüm
struct Args {
ad: String,
tekrar: u32,
}
fn deger<'a>(args: &[&'a str], ad: &str) -> Option<&'a str> {
let i = args.iter().position(|a| *a == ad)?;
args.get(i + 1).copied()
}
fn ayristir(args: &[&str]) -> Result<Args, String> {
let ad = deger(args, "--ad").ok_or("--ad gerekli")?.to_string();
let tekrar: u32 = match deger(args, "--tekrar") {
Some(s) => s.parse().map_err(|_| format!("--tekrar sayı olmalı: {s}"))?,
None => 1,
};
Ok(Args { ad, tekrar })
}
fn main() {
let a = ayristir(&["--ad", "Ece", "--tekrar", "3"]).unwrap();
for _ in 0..a.tekrar {
println!("Merhaba {}", a.ad);
}
}Beklenen çıktı
Merhaba Ece Merhaba Ece Merhaba Ece
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>#[arg(default_value_t = 1)]</code> ne sağlar?
- Bayrak verilmezse alan 1 olur ve argüman isteğe bağlı hale gelir Doğru cevap
- Değer her zaman 1 olur
- En az 1 olmalıdır
- Yardım metnine 1 yazar
Açıklama: Varsayılan değer yardım çıktısında da gösterilir: [default: 1].
2 Uzun ve kısa ad
#[arg(short, ____)]
ad: String,
#[arg(short, long)]
ad: String,
Açıklama: long, alan adından --ad bayrağını üretir.
3 Öznitelik ve etkisi
| Kavram | Anlamı |
|---|---|
#[arg(short)] |
-a |
#[arg(long)] |
--ad |
default_value_t = 1 |
Varsayılan 1 |
/// açıklama |
Yardım metni |