CodeBlanks Logo Icon CodeBlanks

Option ve default

Option alanları ve default değeri öğrenirsin.

Option ve default

Gerçek veride bazı alanlar bulunmayabilir. Option<T> alanlar eksikse None olur; #[serde(default)] eksik alana türün varsayılanını koyar. Yazarken None alanları atlamak için skip_serializing_if kullanılır:

#[derive(Serialize, Deserialize)]
struct Profil {
    ad: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    sehir: Option<String>,
    #[serde(default)]
    puan: u32,               // JSON'da yoksa 0
}

Elle atlama

Aynı davranışı elle kurmak için alanları bir listede toplayıp yalnızca dolu olanları ekleriz:

fn json(&self) -> String {
    let mut alanlar = vec![format!("\"ad\":\"{}\"", self.ad)];
    if let Some(s) = &self.sehir {
        alanlar.push(format!("\"sehir\":\"{}\"", s));
    }
    format!("{{{}}}", alanlar.join(","))
}

format!("{{{}}}", ..): dıştaki {{ ve }} düz süslü parantez, ortadaki {} yer tutucudur.

Uygulama İsteğe bağlı şehir

Profil { ad: String, sehir: Option<String> } için None şehri atlayan yukarıdaki json metodunu yaz. Ece (şehirsiz) ve Can (İzmir) profillerini ayrı satırlara yazdır.

Başlangıç kodu

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

Örnek çözüm

main.rs
struct Profil {
    ad: String,
    sehir: Option<String>,
}

impl Profil {
    fn json(&self) -> String {
        let mut alanlar = vec![format!("\"ad\":\"{}\"", self.ad)];
        if let Some(s) = &self.sehir {
            alanlar.push(format!("\"sehir\":\"{}\"", s));
        }
        format!("{{{}}}", alanlar.join(","))
    }
}

fn main() {
    let a = Profil { ad: "Ece".into(), sehir: None };
    let b = Profil { ad: "Can".into(), sehir: Some("İzmir".into()) };
    println!("{}", a.json());
    println!("{}", b.json());
}

Beklenen çıktı

{"ad":"Ece"}
{"ad":"Can","sehir":"İzmir"}

Soru ve cevaplar

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

1 <code>skip_serializing_if</code> olmadan <code>sehir: None</code> nasıl yazılır?

  • Hata verir
  • "sehir":null Doğru cevap
  • Hiç yazılmaz
  • "sehir":""

Açıklama: serde None'ı JSON null'a çevirir; alanı tamamen atlamak için skip_serializing_if gerekir.

2 Varsayılan değer

Soru
#[serde(____)]
puan: u32,   // JSON'da yoksa 0
Cevap
#[serde(default)]
puan: u32,   // JSON'da yoksa 0

Açıklama: #[serde(default)] eksik alana Default::default() koyar.

3 Öznitelik ve etkisi

Kavram Anlamı
Option<T> Eksikse None
#[serde(default)] Eksikse varsayılan
skip_serializing_if Koşula göre atla
#[serde(skip)] Hiç yazma/okuma

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