CodeBlanks Logo Icon CodeBlanks

Türler

$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

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

Örnek çözüm

main.rs
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ı

Soru
macro_rules! sabit_fn {
    ($ad:ident, $tur:____, $deger:expr) => {
        fn $ad() -> $tur { $deger }
    };
}
Cevap
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(_)

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