Türler
- Rust kursu
- İleri seviye
- Ders 44/81
- 4 dk
$ty:ty gibi tür parametreleriyle makro yazarsın.
Türler
Fragman türü, makronun hangi kod parçasını beklediğini söyler:
$x:expr // ifade: 1 + 2, f(x)
$x:ident // tanımlayıcı: ad, Kutu
$x:ty // tür: u32, Vec<String>
$x:pat // kalıp: Some(_), 1..=5
$x:block // blok: { .. }
$x:item // öğe: fn, struct, impl
$x:literal // sabit: 42, "metin"
$x:tt // tek bir belirteç ağacı (her şey)ident ve ty, makroların fonksiyon ve tür tanımı üretebilmesini sağlar; fonksiyonlarla bu imkânsızdır.
Öğe üreten makro
Tekrarlayan tanımları tek satıra indirmek için:
macro_rules! sabit_fn {
($ad:ident, $tur:ty, $deger:expr) => {
fn $ad() -> $tur {
$deger
}
};
}
sabit_fn!(surum, &'static str, "1.0");
sabit_fn!(port, u16, 8080);
println!("{} {}", surum(), port());Standart kütüphane, sayı türlerinin onlarca trait uygulamasını bu tür makrolarla üretir.
Uygulama Fonksiyon üreten makro
Yukarıdaki sabit_fn! makrosunu yaz ve surum (&'static str, "1.0") ile port (u16, 8080) fonksiyonlarını üret. İki fonksiyonun sonucunu boşlukla yazdır.
Başlangıç kodu
fn main() {
// buraya yaz
}Örnek çözüm
macro_rules! sabit_fn {
($ad:ident, $tur:ty, $deger:expr) => {
fn $ad() -> $tur {
$deger
}
};
}
sabit_fn!(surum, &'static str, "1.0");
sabit_fn!(port, u16, 8080);
fn main() {
println!("{} {}", surum(), port());
}Beklenen çıktı
1.0 8080
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Bir makronun yeni bir fonksiyon adı üretebilmesi için hangi fragman gerekir?
- literal
- ident Doğru cevap
- expr
- ty
Açıklama: $ad:ident ile alınan ad, gövdede fn $ad() biçiminde kullanılır.
2 Tür fragmanı
macro_rules! sabit_fn {
($ad:ident, $tur:____, $deger:expr) => {
fn $ad() -> $tur { $deger }
};
}
macro_rules! sabit_fn {
($ad:ident, $tur:ty, $deger:expr) => {
fn $ad() -> $tur { $deger }
};
}
Açıklama: ty fragmanı bir tür ifadesini eşler.
3 Fragman ve örnek
| Kavram | Anlamı |
|---|---|
ident |
surum |
ty |
&'static str |
expr |
"1.0" |
pat |
Some(_) |