Option ve default
- Rust kursu
- Orta seviye
- Ders 105/115
- 4 dk
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
fn main() {
// buraya yaz
}Örnek çözüm
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
#[serde(____)]
puan: u32, // JSON'da yoksa 0
#[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 |