CodeBlanks Logo Icon CodeBlanks

Özet - Prosedürel makrolar

derive, syn ve quote'ı birleştirerek bir HelloMacro derive yazarsın.

Prosedürel makrolar özeti

Prosedürel makrolar, proc-macro = true olan ayrı bir crate'te yazılan ve derleme anında çalışan fonksiyonlardır: TokenStream → TokenStream. Türleri: #[proc_macro_derive] (öğeye ek kod), #[proc_macro_attribute] (öğeyi dönüştürür), #[proc_macro] (fonksiyon benzeri). syn ayrıştırır, quote! üretir, hatalar syn::Error ile konumlu bildirilir. Basit tekrar için macro_rules! çoğu zaman yeterlidir.

Varsayılan değerli kurucu

Pek çok derive makrosu (örneğin derive_builder, smart-default) alanlara varsayılan değer verir. Aynı fikri bildirimsel bir makroyla kuralım:

macro_rules! varsayilanli {
    (struct $ad:ident { $($alan:ident : $tur:ty = $deger:expr),* $(,)? }) => {
        struct $ad { $($alan: $tur),* }
        impl $ad {
            fn new() -> Self {
                Self { $($alan: $deger),* }
            }
        }
    };
}

varsayilanli!(struct Ayar { port: u16 = 8080, ad: &'static str = "app" });

Uygulama Varsayılanlı struct

Yukarıdaki varsayilanli! makrosunu yaz ve Ayar struct'ını onunla üret. Ayar::new() ile oluşturup port ve ad alanlarını boşlukla yazdır.

Başlangıç kodu

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

Örnek çözüm

main.rs
macro_rules! varsayilanli {
    (struct $ad:ident { $($alan:ident : $tur:ty = $deger:expr),* $(,)? }) => {
        struct $ad {
            $($alan: $tur),*
        }
        impl $ad {
            fn new() -> Self {
                Self {
                    $($alan: $deger),*
                }
            }
        }
    };
}

varsayilanli!(struct Ayar { port: u16 = 8080, ad: &'static str = "app" });

fn main() {
    let a = Ayar::new();
    println!("{} {}", a.port, a.ad);
}

Beklenen çıktı

8080 app

Soru ve cevaplar

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

1 Derive makrolarının yardımcı öznitelikleri (<code>#[serde(rename = ..)]</code>) nasıl tanımlanır?

  • Tanımlanamaz
  • macro_rules! ile
  • #[proc_macro_derive(Ad, attributes(serde))] ile Doğru cevap
  • Ayrı bir makro olarak

Açıklama: Kayıtlı yardımcı öznitelikler derleyici tarafından reddedilmez ve makro onları DeriveInput içinden okur.

2 Yardımcı öznitelik

Soru
#[proc_macro_derive(Serialize, ____(serde))]
pub fn serialize(girdi: TokenStream) -> TokenStream { .. }
Cevap
#[proc_macro_derive(Serialize, attributes(serde))]
pub fn serialize(girdi: TokenStream) -> TokenStream { .. }

Açıklama: attributes(..) derive makrosunun yardımcı özniteliklerini kaydeder.

3 Grubun özeti

Kavram Anlamı
proc-macro = true Makro crate'i
TokenStream Girdi ve çıktı
syn Ayrıştırma
quote! Üretim

İleri seviye bölümündeki tüm dersler