Portal/Notes πŸ“
RustRustlings_exercise

Makro

Versi Bahasa Indonesia. Baca dalam Bahasa Inggris

  • Makro adalah cara menulis kode yang menulis kode lain, yang dikenal sebagai metaprogramming.
  • Makro dapat mengambil jumlah parameter yang bervariasi.
  • Untuk mendefinisikan makro, kita menggunakan konstruksi macro_rules!.
  • Anotasi #[macro_export] menunjukkan bahwa makro ini harus tersedia setiap kali crate di mana makro didefinisikan dibawa ke scope.
  • Kita harus mendefinisikan makro atau membawanya ke scope sebelum memanggilnya dalam sebuah file, berbeda dengan fungsi yang dapat didefinisikan di mana saja dan dipanggil di mana saja.
  • Referensi:

macros1.rs

macro_rules! my_macro {
    () => {
        println!("Check out my macro!");
    };
}

fn main() {
    // Fix the macro call by adding `!`.
    my_macro!();
}
  • Latihan ini sederhana, kita hanya perlu menambahkan ! saat memanggil makro.

    my_macro!();

macros2.rs

// Define macro before using it
macro_rules! my_macro {
    () => {
        println!("Check out my macro!");
    };
}

fn main() {
    my_macro!();
}
  • Latihan ini juga mudah.
  • Kita hanya perlu memindahkan definisi makro sebelum fungsi main.

macros3.rs

// Fix the compiler error without taking the macro definition out of this
// module.
mod macros {
    // add export macro attribute
    #[macro_export]
    macro_rules! my_macro {
        () => {
            println!("Check out my macro!");
        };
    }
}

fn main() {
    my_macro!();
}
  • Di latihan ini kita perlu mengekspor my_macro sehingga dapat diakses di fungsi main.
  • Kita dapat melakukannya dengan menambahkan anotasi #[macro_export] di definisi my_macro.

macros4.rs

#[rustfmt::skip]
macro_rules! my_macro {
    () => {
        println!("Check out my macro!");
    }; // add `;`
    ($val:expr) => {
        println!("Look at this other macro: {}", $val);
    }; // add `;`
}

fn main() {
    my_macro!();
    my_macro!(7777);
}
  • Di latihan ini kita hanya perlu menambahkan ; untuk setiap statement aturan makro.

Edit on GitHub

Last updated on

Makro | Faisal Affan