CodeBlanks Logo Icon CodeBlanks

Tekrarlar

$(...),* 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!()          // 0

Ayraç 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)   // 9

Uygulama 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

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

Örnek çözüm

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

Soru
macro_rules! topla {
    ($($x:expr),____) => {
        0 $(+ $x)*
    };
}
Cevap
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

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