CodeBlanks Logo Icon CodeBlanks

Pozisyonel argüman

Pozisyonel argüman tanımlamayı öğrenirsin.

Pozisyonel argüman

Önünde bayrak olmayan argümanlar pozisyoneldir; sıralarına göre alanlara atanır. Vec türlü pozisyonel alan, kalan tüm değerleri toplar:

#[derive(Parser)]
struct Args {
    /// İşlenecek dosyalar
    dosyalar: Vec<String>,

    /// Ayrıntılı çıktı
    #[arg(short, long)]
    ayrintili: bool,
}
// $ say a.txt --ayrintili b.txt
// dosyalar = ["a.txt", "b.txt"], ayrintili = true

bool alanlar değer almayan bayraklardır: varsa true, yoksa false.

Elle ayırma

Bayrakları ve pozisyonel değerleri ayırmak için partition kullanılabilir:

let (bayraklar, dosyalar): (Vec<&str>, Vec<&str>) =
    args.iter().partition(|a| a.starts_with("--"));
let ayrintili = bayraklar.contains(&"--ayrintili");

partition, bir koşula göre yineleyiciyi iki koleksiyona böler; tek geçişte çalışır.

Uygulama Dosyalar ve bayrak

["a.txt", "--ayrintili", "b.txt"] argümanlarını partition ile bayraklar ve dosyalar olarak ayır. Dosya listesini {:?} ile ve --ayrintili bayrağının olup olmadığını boşlukla yazdır.

Başlangıç kodu

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

Örnek çözüm

main.rs
fn main() {
    let args = ["a.txt", "--ayrintili", "b.txt"];
    let (bayraklar, dosyalar): (Vec<&str>, Vec<&str>) = args.iter().partition(|a| a.starts_with("--"));
    let ayrintili = bayraklar.contains(&"--ayrintili");
    println!("{:?} {}", dosyalar, ayrintili);
}

Beklenen çıktı

["a.txt", "b.txt"] true

Soru ve cevaplar

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

1 <code>--</code> argümanının anlamı nedir? (<code>say -- --garip-ad.txt</code>)

  • Yorum başlatır
  • Tüm bayrakları kapatır
  • Hata verir
  • Sonrasındaki her şey bayrak değil, pozisyonel değerdir Doğru cevap

Açıklama: Bu POSIX geleneğidir; tire ile başlayan dosya adlarını işlemek için kullanılır. cargo run -- da aynı amaçla kullanılır.

2 İkiye böl

Soru
let (bayraklar, dosyalar): (Vec<&str>, Vec<&str>) =
    args.iter().____(|a| a.starts_with("--"));
Cevap
let (bayraklar, dosyalar): (Vec<&str>, Vec<&str>) =
    args.iter().partition(|a| a.starts_with("--"));

Açıklama: partition koşulu sağlayanları ve sağlamayanları ayrı koleksiyonlara koyar.

3 Alan türü ve davranış

Kavram Anlamı
dosya: String Zorunlu tek değer
dosyalar: Vec<String> Sıfır ya da çok değer
ayrintili: bool Değersiz bayrak
-- Bayrak ayrıştırmayı bitirir

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