Makro Deklaratif (`macro_rules!`)
Pelajari cara menulis makro deklaratif untuk mengabstraksikan pola kode berulang dan menghasilkan kode saat kompilasi.
Makro Deklaratif (`macro_rules!`) adalah pelajaran Learn Rust Coding gratis di CoddyKit. Ini adalah pelajaran 1 dari 3. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Learn Rust Coding, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Learn Rust Coding mencakup 3 pelajaran total.
Apa Itu Makro Rust?
Makro adalah cara menulis kode yang menulis kode! Makro mirip dengan fungsi, tetapi bekerja pada pohon sintaksis (struktur kode Anda), bukan pada nilai.
- Makro membantu mengabstraksikan kode yang berulang.
- Makro memungkinkan penggunaan Bahasa Spesifik Domain (DSL) di dalam Rust.
- Makro dijalankan saat kompilasi dan diperluas menjadi kode Rust biasa sebelum kompilasi.
Sintaks Makro Deklaratif
Makro deklaratif Rust menggunakan kata kunci macro_rules!. Makro ini mendefinisikan sekumpulan aturan yang mencocokkan pola tertentu dari kode Rust.
Anggaplah ini sebagai pencocokan pola untuk cuplikan kode. Saat kompilator melihat pemanggilan makro, kompilator mencoba mencocokkan input dengan salah satu aturan yang telah Anda definisikan.
Makro `macro_rules!` Pertama Anda
Mari kita buat makro yang sangat sederhana untuk mencetak sapaan. Perhatikan kata kunci macro_rules! dan sintaks () => {} yang mendefinisikan aturan tanpa pola input.
Coba jalankan contoh ini:
macro_rules! greet {
() => {
println!("Hello from a macro!");
};
}
fn main() {
greet!(); // Call our macro!
}Menangkap Input dengan Penentu
Makro dapat menerima input menggunakan "penentu". Penentu ini memberi tahu makro jenis sintaks Rust yang harus diharapkan untuk ditangkap.
$expr: Sebuah ekspresi (misalnya,1 + 2,"hello")$ident: Sebuah pengenal (misalnya, nama variabel atau nama fungsi)$ty: Sebuah tipe (misalnya,i32,String)$block: Sebuah blok kode (misalnya,{ ... })- ...dan masih banyak lagi!
Makro dengan Argumen
Berikut makro yang menerima sebuah ekspresi ($e:expr) dan mencetak nilainya. :expr adalah penentunya.
$e yang ditangkap kemudian tersedia untuk digunakan dalam isi makro. Makro stringify! mengubah ekspresi menjadi representasi stringnya.
macro_rules! debug_print {
($e:expr) => {
println!("Debug: {} = {:?}", stringify!($e), $e);
};
}
fn main() {
let x = 10;
debug_print!(x + 5);
debug_print!("Rust macros are fun");
}Menangani Beberapa Input
Bagaimana jika Anda ingin makro menerima beberapa argumen dengan tipe yang sama? Anda dapat menggunakan operator pengulangan: $()*.
$(): Konten di dalamnya adalah pola yang akan diulang.*: Nol atau lebih pengulangan.+: Satu atau lebih pengulangan.- Anda juga dapat menentukan pemisah, seperti
$(...),*untuk item yang dipisahkan koma.
Makro dengan Argumen Berulang
Mari kita buat makro yang menerima beberapa ekspresi, dipisahkan dengan koma, lalu mencetak masing-masing ekspresi secara terpisah. Ini berguna untuk membuat struktur yang menyerupai daftar.
macro_rules! print_all {
( $( $x:expr ),* ) => {
$( // This $(...)* repeats the `println!` call
println!("Item: {:?}", $x);
)*
};
}
fn main() {
print_all!(1, "hello", true, 3.14);
print_all!("Just one item");
}Memahami Higiene Makro
Makro Rust bersifat "higienis". Artinya, variable yang didefinisikan di dalam makro tidak akan secara tidak sengaja bertabrakan dengan variable di luar makro, meskipun namanya sama.
Kompilator mengganti nama berbagai hal secara internal selama ekspansi untuk mencegah efek samping yang tidak diinginkan, sehingga makro lebih aman dan lebih mudah diprediksi saat digunakan.
Cara Men-debug Makro
Terkadang makro tidak melakukan ekspansi seperti yang Anda harapkan. Rust menyediakan cara untuk melihat kode hasil ekspansi:
- Jalankan
cargo expand(memerlukan pemasangan alatcargo-expand) - Gunakan
rustc --pretty expandedsecara langsung pada file sumber Anda.
Ini menampilkan kode Rust mentah yang dihasilkan makro Anda, sehingga sangat membantu untuk men-debug dan memahami perilaku makro yang kompleks!
Kuis Pencocokan Pola Makro
Perhatikan definisi makro berikut:
macro_rules! make_tuple {
( $x:expr, $y:expr ) => {
($x, $y)
};
}Manakah dari baris berikut yang akan berhasil dikompilasi dan menggunakan makro make_tuple!?
Ringkasan: Makro Deklaratif
Dalam pelajaran ini, Anda telah mempelajari makro deklaratif menggunakan macro_rules!:
- Makro menghasilkan kode saat kompilasi, sehingga mengabstraksikan pola yang berulang.
- Makro menggunakan pencocokan pola untuk menangkap input berdasarkan sintaks.
- Penentu seperti
$exprdan$identmenentukan jenis sintaks yang diharapkan. - Operator pengulangan seperti
$()*menangani beberapa argumen dengan pemisah yang fleksibel. - Makro bersifat higienis, sehingga mencegah konflik nama yang tidak disengaja.
Makro adalah alat yang sangat berguna untuk mengurangi kode berulang dan membuat API Rust yang fleksibel serta ergonomis!
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Makro Deklaratif (`macro_rules!`)” gratis?
Ya — teks lengkap “Makro Deklaratif (`macro_rules!`)” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Learn Rust Coding, upgrade ke CoddyKit PRO. Kursus Learn Rust Coding mencakup 3 pelajaran total.
Apa yang akan aku pelajari di “Makro Deklaratif (`macro_rules!`)”?
Pelajari cara menulis makro deklaratif untuk mengabstraksikan pola kode berulang dan menghasilkan kode saat kompilasi. Kamu berlatih Learn Rust Coding dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Learn Rust Coding?
Tidak diperlukan pengalaman sebelumnya. Learn Rust Coding di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 3.
Berapa lama pelajaran “Makro Deklaratif (`macro_rules!`)” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Learn Rust Coding ini?
Ya. Setiap pelajaran Learn Rust Coding menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Makro Deklaratif (`macro_rules!`)
- Makro Prosedural: Derive, Fungsi
- Berinteraksi dengan Rust Tidak Aman