- Créer des macros avec macro_rules! (c'est puissant!)
- Comprendre la syntaxe des macros
- Utiliser les patterns
- Voir les exemples courants
Imaginez un raccourci clavier ⌨️:
- Macro = Un raccourci qui remplace du code
- Vous tapez le raccourci → Le compilateur le remplace!
- C'est super pratique pour éviter la répétition!
C'est exactement comme les macros fonctionnent! C'est super puissant!
┌─────────────────────────────────────────┐
│ ⌨️ MACROS = RACCOURCIS CLAVIER ⌨️ │
├─────────────────────────────────────────┤
│ │
│ Vous tapez: │
│ say_hello!() │
│ │
│ Macro transforme en: │
│ println!("Hello, World!"); │
│ │
│ C'est automatique! ✨ │
│ │
└─────────────────────────────────────────┘
Mnémonique: "Raccourci" - Les macros sont comme des raccourcis clavier: vous tapez un raccourci, le compilateur le remplace par le code complet!
macro_rules! say_hello {
() => {
println!("Hello!");
};
}
fn main() {
say_hello!();
}macro_rules! create_function {
($func_name:ident) => {
fn $func_name() {
println!("Fonction {} appelée", stringify!($func_name));
}
};
}
create_function!(foo);
create_function!(bar);
fn main() {
foo();
bar();
}macro_rules! vec {
( $( $x:expr ),* ) => {
{
let mut temp_vec = Vec::new();
$(
temp_vec.push($x);
)*
temp_vec
}
};
}
fn main() {
let v = vec![1, 2, 3];
println!("{:?}", v);
}macro_rules! test {
($left:expr; and $right:expr) => {
println!("{:?} and {:?} is {:?}",
$left, $right, $left && $right);
};
($left:expr; or $right:expr) => {
println!("{:?} or {:?} is {:?}",
$left, $right, $left || $right);
};
}
fn main() {
test!(1i32 + 1 == 2i32; and 2i32 * 2 == 4i32);
test!(true; or false);
}ident → Identifiant (nom de variable, fonction)
expr → Expression
ty → Type
pat → Pattern
stmt → Statement
block → Bloc de code
item → Item (fonction, struct, etc.)
Les macros sont expansées à la compilation :
- Pas de runtime overhead
- Vérification à la compilation
- Attention aux injections de code
- Tester exhaustivement