Prompt

めっちゃよく使うマクロ達はどれ!

Rustのコーディング効率を爆上げしてくれる、**「これを知らなきゃ始まらない!」**という超頻出マクロたちを整理したよ!

Rustのマクロは、複雑なコードを生成したり、可変長引数を扱ったりするための魔法の杖だね。用途別に見ていこう!🚀


1. 📢 出力・デバッグ系(開発中の親友)

まずは、コンソールに情報を出すためのもの。これは説明不要なレベルで毎日使うよ!

  • println! / print!: 標準出力。フォーマット指定({})ができる。

  • eprintln!: 標準エラー出力。エラーメッセージはこっちに出すのがマナー。

  • format!: 文字列を作る。出力せずに String を返してくれる。

  • dbg!: 最強のデバッグ用。 渡した式の値と、その「ファイル名:行数」を表示して、さらに値をそのまま返す。

    Rust

    let x = dbg!(1 + 2); // "src/main.rs:2: 1 + 2 = 3" と出力され、xには3が入る
    

2. 📦 データ構造の初期化系

Rustの型は厳格だけど、マクロを使えばリテラルっぽく書けるんだ。

  • vec!: Vec<T> を一瞬で作る。

    Rust

    let v = vec![1, 2, 3];
    let v2 = vec![0; 10]; // 0が10個入ったVec
    
  • panic!: プログラムを強制終了させる。「ここに来るはずがない」という場所に置く。

  • todo!: 「あとで書く」用。コンパイルは通るけど、実行するとパニックする。未実装機能のプレースホルダに最適!


3. 🧪 テスト・アサーション系

堅牢なコードを書くための守護神たち。

  • assert!: 条件が true かチェック。

  • assert_eq! / assert_ne!: 左右の値が「等しいか(Equal)」「等しくないか(Not Equal)」をチェック。テストコードの主役!


4. 🎩 導出マクロ(derive

構造体やEnumの上に書く #[derive(...)]。これ自体が「手続き型マクロ」と呼ばれる強力な機能なんだ。

  • #[derive(Debug)]: {:?} で表示できるようにする。

  • #[derive(Clone, Copy)]: 複製を可能にする。

  • #[derive(Serialize, Deserialize)]: (Serdeクレート) JSONなどへの変換を自動化する。


5. ⚡ Tokio 特有のマクロ(非同期の要)

Tokioを使うなら、これらは「呼吸」と同じくらい頻出だよ!

  • #[tokio::main]: async fn main を実行可能にする魔法のアノテーション。

  • tokio::select!: 超重要! 複数の非同期処理(Future)を同時に待ち構えて、**「一番早く終わったやつ」**の処理を実行する。

    Rust

    tokio::select! {
        val = rx.recv() => println!("受信!: {:?}", val),
        _ = tokio::time::sleep(Duration::from_secs(1)) => println!("タイムアウト..."),
    }
    
  • tokio::join!: 複数の非同期処理を全部まとめて実行し、全部終わるまで待つ。


💡 知っておくと楽しい豆知識:マクロは「メタプログラミング」

Rustのマクロは、コンパイルの非常に早い段階で**「トークン(単語)の並び」を「別のRustコード」に書き換えている**んだ。

情報工学を学ぶ君なら、コンパイラの「構文解析(Parsing)」の段階でコードが動的に生成されている様子をイメージすると、マクロの凄さがより深く理解できるはずだよ!

特にお気に入りのマクロや、「自作マクロってどう作るの?」みたいな興味はあるかな?😊✨