derive
- Rust kursu
- Orta seviye
- Ders 102/115
- 4 dk
#[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
fn main() {
// buraya yaz
}Örnek çözüm
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
impl<T: ____> JsonYaz for Vec<T> {
fn json(&self) -> String { .. }
}
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"] |