Tekrarlar
- Rust kursu
- İleri seviye
- Ders 43/81
- 4 dk
$(...),* ile tekrar kalıplarını öğrenirsin.
Tekrarlar
Makroların en güçlü yanı tekrar kalıplarıdır: $( ... ),* "virgülle ayrılmış sıfır ya da daha fazla", $( ... ),+ "bir ya da daha fazla", $( ... )? "isteğe bağlı" demektir. Gövdede aynı kalıp her eşleşme için tekrarlanır:
macro_rules! topla {
($($x:expr),*) => {
0 $(+ $x)*
};
}
topla!(1, 2, 3) // 0 + 1 + 2 + 3
topla!() // 0Ayraç kalıbın parçasıdır: $(..),* virgül, $(..);* noktalı virgül bekler.
Birden çok kol
Bir makronun birden çok kolu olabilir; ilk eşleşen kullanılır. Özyineleme ile karmaşık kalıplar kurulabilir:
macro_rules! en_buyuk {
($x:expr) => { $x };
($x:expr, $($kalan:expr),+) => {
{ let a = $x; let b = en_buyuk!($($kalan),+); if a > b { a } else { b } }
};
}
en_buyuk!(3, 9, 4) // 9Uygulama Değişken argümanlı toplam
Yukarıdaki topla! makrosunu yaz. topla!(1, 2, 3) ve topla!() sonuçlarını boşlukla yazdır.
Başlangıç kodu
fn main() {
// buraya yaz
}Örnek çözüm
macro_rules! topla {
($($x:expr),*) => {
0 $(+ $x)*
};
}
fn main() {
println!("{} {}", topla!(1, 2, 3), topla!());
}Beklenen çıktı
6 0
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>topla!(1, 2, 3,)</code> (sonda virgül) bu makroyla eşleşir mi?
- Uyarı verir
- Panic
- Hayır; $(,)? eklenmeli Doğru cevap
- Evet
Açıklama: Sondaki virgülü kabul etmek için kalıp ($($x:expr),* $(,)?) biçiminde yazılır; vec! böyle tanımlıdır.
2 Tekrar kalıbı
macro_rules! topla {
($($x:expr),____) => {
0 $(+ $x)*
};
}
macro_rules! topla {
($($x:expr),*) => {
0 $(+ $x)*
};
}
Açıklama: * sıfır ya da daha fazla tekrarı kabul eder.
3 Kalıp ve anlamı
| Kavram | Anlamı |
|---|---|
$(..),* |
Sıfır ya da çok |
$(..),+ |
En az bir |
$(..)? |
İsteğe bağlı |
$(,)? |
Sondaki virgül |