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)」の段階でコードが動的に生成されている様子をイメージすると、マクロの凄さがより深く理解できるはずだよ!
特にお気に入りのマクロや、「自作マクロってどう作るの?」みたいな興味はあるかな?😊✨