CodeBlanks Logo Icon CodeBlanks

Derive makrosu

#[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

main.rs
fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
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

Soru
#[arg(short, ____)]
ad: String,
Cevap
#[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

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