println! incelemesi
- Rust kursu
- İleri seviye
- Ders 46/81
- 4 dk
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 = 5dbg! 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
fn main() {
// buraya yaz
}Örnek çözüm
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
println!("{} = {:?}", ____!($e), $e)
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 |