CodeBlanks Logo Icon CodeBlanks

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.

Başlangıç kodu

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

Örnek çözüm

main.rs
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());
}

Beklenen çıktı

[1,2,3] ["a","b"]

Soru ve cevaplar

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

1 Bir alanın türü <code>Serialize</code> uygulamıyorsa ne olur?

  • derive derleme hatası verir Doğru cevap
  • Alan atlanır
  • null yazılır
  • Çalışma anında hata

Açıklama: 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ı.

2 Genel uygulama

Soru
impl<T: ____> JsonYaz for Vec<T> {
    fn json(&self) -> String { .. }
}
Cevap
impl<T: JsonYaz> JsonYaz for Vec<T> {
    fn json(&self) -> String { .. }
}

Açıklama: Vec<T>, elemanları JsonYaz olduğu sürece JsonYaz'dır.

3 Değer ve JSON

Kavram Anlamı
42 42
"a" "a"
vec![1, 2, 3] [1,2,3]
vec!["a", "b"] ["a","b"]

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