println!のように、関数のように呼び出すマクロをfunction-likeマクロというらしい。
マクロを定義するとき、
例えばこんな感じ。
macro_rules! マクロ名 { ($引数:expr) => { println!("引数を使う: {}", $引数); }; }
使用例。
macro_rules! print_arg { ($arg:expr) => { println!("Argument: {}", $arg); }; }
fn main(){ print_arg!(3.5); // 出力: Argument: 3.5 }
macro_rules! print_arg {
($e1:expr, $e2:expr) =>{
println!("e1: {} e2 {}", $e1,$e2);
};
} fn main(){ print_arg!(3.5 , "hello"); }
macro_rules! print_arg { ( $($arg:expr) , * ) => { $( println!("Argument: {}", $arg); ) * }; } fn main(){ print_arg!(3.5 , "hello" , 6); // Argument: 3.5 // Argument: hello // Argument: 6 }
trait MyPrint{ fn print(&self); }
impl MyPrint for i32{ fn print(&self){ println!("i32: {}", *self); } } impl MyPrint for f32{ fn print(&self){ println!("f32: {}", *self); } }
macro_rules! print_arg { ($e:expr) =>{ MyPrint::print(&$e); }; }
fn main(){ print_arg!(3.5); // f32: 3.5 print_arg!(100); // i32: 100 }