Özet - Prosedürel makrolar
- Rust kursu
- İleri seviye
- Ders 53/81
- 5 dk
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
fn main() {
// buraya yaz
}Örnek çözü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" });
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
#[proc_macro_derive(Serialize, ____(serde))]
pub fn serialize(girdi: TokenStream) -> TokenStream { .. }
#[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 |