CodeBlanks Logo Icon CodeBlanks

println! incelemesi

println! makrosunun iç yapısını incelersin.

println! incelemesi

println! bir makrodur çünkü biçim metnini derleme anında denetler: yer tutucu sayısı ile argüman sayısı uyuşmazsa derleme hatası verir. Kabaca şöyle açılır:

println!("x = {}", 5);
// açılımı (sadeleştirilmiş):
::std::io::_print(format_args!("x = {}\n", 5));

format_args! derleyicinin içine gömülü bir makrodur; biçimi ayrıştırır ve bellek ayırmadan bir fmt::Arguments değeri üretir. format!, write! ve panic! de aynı temeli kullanır.

Kendi biçim makron

Argümanları olduğu gibi aktarmak için tt tekrarı kullanılır; böylece makro println!'in tüm biçimlerini destekler. stringify! ise bir ifadeyi kaynak metni olarak verir:

macro_rules! kayit {
    ($($arg:tt)*) => {
        println!("[log] {}", format!($($arg)*))
    };
}

macro_rules! goster {
    ($e:expr) => {
        println!("{} = {:?}", stringify!($e), $e)
    };
}

kayit!("x = {}", 5);   // [log] x = 5
goster!(2 + 3);        // 2 + 3 = 5

dbg! makrosu tam olarak bu fikre dayanır.

Uygulama Günlük makroları

Yukarıdaki kayit! ve goster! makrolarını yaz. kayit!("x = {}", 5) ve goster!(2 + 3) çağrılarını yap.

Başlangıç kodu

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

Örnek çözüm

main.rs
macro_rules! kayit {
    ($($arg:tt)*) => {
        println!("[log] {}", format!($($arg)*))
    };
}

macro_rules! goster {
    ($e:expr) => {
        println!("{} = {:?}", stringify!($e), $e)
    };
}

fn main() {
    kayit!("x = {}", 5);
    goster!(2 + 3);
}

Beklenen çıktı

[log] x = 5
2 + 3 = 5

Soru ve cevaplar

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

1 <code>println!("{} {}", 1)</code> ne olur?

  • "1 " yazar
  • Panic
  • "1 {}" yazar
  • Derleme hatası: 2 yer tutucu, 1 argüman Doğru cevap

Açıklama: Biçim metni sabit olmalıdır; bu sayede derleyici onu ayrıştırıp denetleyebilir.

2 Kaynak metni

Soru
println!("{} = {:?}", ____!($e), $e)
Cevap
println!("{} = {:?}", stringify!($e), $e)

Açıklama: stringify! bir kod parçasını metin olarak verir.

3 Makro ve işi

Kavram Anlamı
format_args! Ayırmasız biçim
format! String üretir
stringify! Kodu metne çevirir
dbg! İfade ve değer yazar

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