スポンサーリンク

Rustのfunction-likeマクロについて

println!のように、関数のように呼び出すマクロをfunction-likeマクロというらしい。

マクロを定義するとき、

  • macro_rules! マクロ名 { } で定義する
  • $引数名 で引数を表す。
  • $expr は引数の種類を表す。式を表す$exprの他に、パターンを表す$pat等たくさんある。

 

例えばこんな感じ。

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
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: