Rust
derive
#[derive(Serialize, Deserialize)] ile otomatik uygulama yaparsın.
derive
#[derive(Serialize, Deserialize)], alan alan gezen kodu otomatik üretir. Bunun çalışması için tüm alan türlerinin de bu trait'leri uygulaması gerekir; standart türlerin (String, sayılar, Vec, Option, HashMap) hepsi uygular:
#[derive(Serialize, Deserialize)]
struct Raf {
ad: String,
kitaplar: Vec<Kitap>, // Kitap da derive etmeli
etiketler: Vec<String>,
}
Enum'lar da türetilebilir; variant'lar varsayılan olarak {"Ekle":{"metin":".."}} biçiminde yazılır.
Trait ile birleştirilebilirlik
derive'ın gücü birleştirilebilirliktir: her tür yalnızca kendi parçasını bilir, iç içe yapılar kendiliğinden çalışır. Aynı fikri küçük bir trait ile görebiliriz:
trait JsonYaz {
fn json(&self) -> String;
}
impl JsonYaz for i32 {
fn json(&self) -> String { self.to_string() }
}
impl<T: JsonYaz> JsonYaz for Vec<T> {
fn json(&self) -> String {
let ic: Vec<String> = self.iter().map(|x| x.json()).collect();
format!("[{}]", ic.join(","))
}
}
Vec<T> uygulaması, içteki türün nasıl yazıldığını bilmeden çalışır.
Uygulama Birleştirilebilir yazıcı
JsonYaz trait'ini i32, &str (tırnaklı) ve Vec<T: JsonYaz> için uygula. vec![1, 2, 3] ve vec!["a", "b"] sonuçlarını boşlukla yazdır.
Örnek çözümü göster
trait JsonYaz {
fn json(&self) -> String;
}
impl JsonYaz for i32 {
fn json(&self) -> String {
self.to_string()
}
}
impl JsonYaz for &str {
fn json(&self) -> String {
format!("\"{}\"", self)
}
}
impl<T: JsonYaz> JsonYaz for Vec<T> {
fn json(&self) -> String {
let ic: Vec<String> = self.iter().map(|x| x.json()).collect();
format!("[{}]", ic.join(","))
}
}
fn main() {
println!("{} {}", vec![1, 2, 3].json(), vec!["a", "b"].json());
}
Kendini test et
-
Bir alanın türü <code>Serialize</code> uygulamıyorsa ne olur?
- derive derleme hatası verir
- Alan atlanır
- null yazılır
- Çalışma anında hata
Cevabı göster
derive derleme hatası verir — Hata, hangi alanın sorun olduğunu söyler. Ya o tür de derive etmeli ya da #[serde(skip)] ile alan dışarıda bırakılmalı.
-
Genel uygulama
impl<T: ____> JsonYaz for Vec<T> {
fn json(&self) -> String { .. }
}
Cevabı göster
impl<T: JsonYaz> JsonYaz for Vec<T> {
fn json(&self) -> String { .. }
}
-
Değer ve JSON
- 42
- 42
- "a"
- "a"
- vec![1, 2, 3]
- [1,2,3]
- vec!["a", "b"]
- ["a","b"]
Sıradaki ders: JSON