Rust
JSON okuma
serde_json ile bir post listesi okursun.
Veriyi okumak
Gerçek projede yazılar bir JSON dizisinden tek satırla okunur:
let metin = fs::read_to_string("yazilar.json")?;
let yazilar: Vec<Yazi> = serde_json::from_str(&metin)?;
Alıştırmada dış crate olmadığı için daha basit bir kayıt biçimi kullanacağız: her kayıt bir satır, alanlar | ile, etiketler virgülle ayrılır:
1|Rust ile başlangıç|ece|rust,giriş|true
2|Sahiplik|can|rust|false
Kayıt ayrıştırma
Kayıt | ile bölünür; alan sayısı yanlışsa ya da bir alan çevrilemezse None döner. Dilim kalıbı, beş alanı tek adımda adlandırır:
fn kayittan(s: &str) -> Option<Yazi> {
let alanlar: Vec<&str> = s.split('|').collect();
let [id, konu, yazar, etiket, yayinda] = alanlar[..] else {
return None;
};
Some(Yazi {
id: id.parse().ok()?,
konu: konu.to_string(),
yazar: yazar.to_string(),
etiketler: etiket.split(',').map(String::from).collect(),
yayinda: yayinda.parse().ok()?,
})
}
Uygulama Kayıtları oku
Yukarıdaki kayittan fonksiyonunu yaz. Üç satırlık veriyi (ikisi geçerli, üçüncüsü 3|bozuk kayıt) lines() ve filter_map ile oku; 2 kayıt: konu1, konu2 biçiminde yazdır.
Örnek çözümü göster
#[derive(Debug, Clone)]
struct Yazi {
id: u32,
konu: String,
yazar: String,
etiketler: Vec<String>,
yayinda: bool,
}
fn kayittan(s: &str) -> Option<Yazi> {
let alanlar: Vec<&str> = s.split('|').collect();
let [id, konu, yazar, etiket, yayinda] = alanlar[..] else {
return None;
};
Some(Yazi {
id: id.parse().ok()?,
konu: konu.to_string(),
yazar: yazar.to_string(),
etiketler: etiket.split(',').map(String::from).collect(),
yayinda: yayinda.parse().ok()?,
})
}
fn main() {
let veri = "1|Rust ile başlangıç|ece|rust,giriş|true\n2|Sahiplik|can|rust|false\n3|bozuk kayıt";
let yazilar: Vec<Yazi> = veri.lines().filter_map(kayittan).collect();
let konular: Vec<&str> = yazilar.iter().map(|y| y.konu.as_str()).collect();
println!("{} kayıt: {}", yazilar.len(), konular.join(", "));
}
Kendini test et
-
Bozuk bir kaydı sessizce atlamanın riski nedir?
- Program yavaşlar
- Derleme hatası
- Risk yoktur
- Veri kaybı fark edilmez; en azından sayı raporlanmalı
Cevabı göster
Veri kaybı fark edilmez; en azından sayı raporlanmalı — Bu derste bozukları atlıyoruz; bir sonraki derste her hatayı numarasıyla raporlayacağız.
-
Geçerlileri topla
let yazilar: Vec<Yazi> = veri.lines().____(kayittan).collect();
Cevabı göster
let yazilar: Vec<Yazi> = veri.lines().filter_map(kayittan).collect();
-
Kayıt ve sonuç
- 1|Rust|ece|rust|true
- Some(Yazi)
- 3|bozuk kayıt
- None (alan eksik)
- x|a|b|c|true
- None (id geçersiz)
- 1|a|b|c|evet
- None (bool geçersiz)
Sıradaki ders: Hata yönetimi