CodeBlanks Logo Icon CodeBlanks

Option flag

--flag ile seçenek ve bool flag tanımlarsın.

Option flag

Alan türü Option<T> ise argüman isteğe bağlıdır; verilmezse None olur. Bu, "kullanıcı belirtmediyse başka bir kaynağa bak" mantığını kurmayı kolaylaştırır:

#[derive(Parser)]
struct Args {
    /// Dinlenecek port
    #[arg(short, long)]
    port: Option<u16>,
}

let port = args.port
    .or_else(|| std::env::var("PORT").ok()?.parse().ok())
    .unwrap_or(8080);

Sıra genellikle: komut satırı → ortam değişkeni → yapılandırma dosyası → varsayılan.

Kısa ve uzun biçim

clap -p 8080, --port 8080 ve --port=8080 biçimlerinin hepsini kabul eder. Elle yazarken iki adı birden aramak gerekir:

fn port_oku(args: &[&str]) -> Result<Option<u16>, String> {
    match args.iter().position(|a| *a == "-p" || *a == "--port") {
        None => Ok(None),
        Some(i) => {
            let s = args.get(i + 1).ok_or("--port için değer eksik")?;
            s.parse().map(Some).map_err(|_| format!("geçersiz port: {s}"))
        }
    }
}

Uygulama İsteğe bağlı port

Yukarıdaki port_oku fonksiyonunu yaz. ["-p", "8080"] ve boş argüman listesi için sonuçları {:?} ile boşlukla yazdır.

Başlangıç kodu

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

Örnek çözüm

main.rs
fn port_oku(args: &[&str]) -> Result<Option<u16>, String> {
    match args.iter().position(|a| *a == "-p" || *a == "--port") {
        None => Ok(None),
        Some(i) => {
            let s = args.get(i + 1).ok_or("--port için değer eksik")?;
            s.parse().map(Some).map_err(|_| format!("geçersiz port: {s}"))
        }
    }
}

fn main() {
    let a = port_oku(&["-p", "8080"]).unwrap();
    let b = port_oku(&[]).unwrap();
    println!("{:?} {:?}", a, b);
}

Beklenen çıktı

Some(8080) None

Soru ve cevaplar

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

1 <code>Option&lt;u16&gt;</code> ile <code>default_value_t</code> arasındaki fark nedir?

  • Option zorunlu yapar
  • default_value_t derlenmez
  • Option ile "verilmedi" bilgisi korunur; varsayılanla kaybolur Doğru cevap
  • Fark yok

Açıklama: Kullanıcının değeri açıkça verip vermediği önemliyse Option kullan.

2 İsteğe bağlı alan

Soru
#[arg(short, long)]
port: ____,
Cevap
#[arg(short, long)]
port: Option<u16>,

Açıklama: Option<T> türü argümanı isteğe bağlı yapar.

3 Komut satırı ve port

Kavram Anlamı
-p 8080 Some(8080)
--port 9000 Some(9000)
(yok) None
-p abc Hata

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