CodeBlanks Logo Icon CodeBlanks

clap tanımı

clap crate'i ile CLI temelini öğrenirsin.

clap tanımı

clap, Rust'ın en yaygın komut satırı argüman ayrıştırıcısıdır. Bir struct tanımlarsın; clap argümanları okur, türlerine çevirir, eksik ya da hatalı girdide açıklayıcı hata ve otomatik --help üretir:

// Cargo.toml: clap = { version = "4", features = ["derive"] }
use clap::Parser;

#[derive(Parser)]
struct Args {
    #[arg(long)]
    ad: String,
}

fn main() {
    let args = Args::parse();
    println!("Merhaba {}", args.ad);
}
// $ selam --ad Ece  →  Merhaba Ece

Alıştırma ortamında dış crate olmadığı için clap'in arka planda yaptığını elle yazacağız; bu, kütüphanenin ne kadar iş kazandırdığını da gösterir.

Elle ayrıştırma

Bir bayrağın değerini bulmak için argümanlar arasında adı aranır ve sonraki eleman alınır:

struct Args {
    ad: String,
}

fn ayristir(args: &[&str]) -> Result<Args, String> {
    let i = args.iter().position(|a| *a == "--ad").ok_or("--ad gerekli")?;
    let ad = args.get(i + 1).ok_or("--ad için değer eksik")?;
    Ok(Args { ad: ad.to_string() })
}

ok_or, Option'ı hata mesajlı bir Result'a çevirir.

Uygulama Bayrak oku

Yukarıdaki Args ve ayristir kodunu yaz. ["selam", "--ad", "Ece"] için Merhaba Ece, ["selam"] için hata mesajını hata: ... biçiminde yazdır.

Başlangıç kodu

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

Örnek çözüm

main.rs
struct Args {
    ad: String,
}

fn ayristir(args: &[&str]) -> Result<Args, String> {
    let i = args.iter().position(|a| *a == "--ad").ok_or("--ad gerekli")?;
    let ad = args.get(i + 1).ok_or("--ad için değer eksik")?;
    Ok(Args { ad: ad.to_string() })
}

fn main() {
    for girdi in [vec!["selam", "--ad", "Ece"], vec!["selam"]] {
        match ayristir(&girdi) {
            Ok(a) => println!("Merhaba {}", a.ad),
            Err(e) => println!("hata: {}", e),
        }
    }
}

Beklenen çıktı

Merhaba Ece
hata: --ad gerekli

Soru ve cevaplar

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

1 <code>Args::parse()</code> zorunlu <code>--ad</code> verilmezse ne yapar?

  • None döndürür
  • Hata mesajı ve kullanım bilgisi yazıp programı sonlandırır Doğru cevap
  • Boş metin kullanır
  • Panic verir

Açıklama: parse hatada çıkar; hatayı kendin ele almak istersen try_parse bir Result döndürür.

2 Ayrıştırıcı trait'i

Soru
#[derive(____)]
struct Args {
    #[arg(long)]
    ad: String,
}
Cevap
#[derive(Parser)]
struct Args {
    #[arg(long)]
    ad: String,
}

Açıklama: clap'in derive arayüzü Parser trait'idir.

3 Komut satırı ve sonuç

Kavram Anlamı
selam --ad Ece Merhaba Ece
selam Hata: --ad gerekli
selam --ad Hata: değer eksik
selam --help Otomatik yardım

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