マクロ
マクロはコンパイル時に Rust コードへ展開され、可変個の引数を取ることができます。末尾に ! が付くことで区別されます。Rust の 標準ライブラリには、便利なマクロがいくつも含まれています。
println!(format, ..)は標準出力に 1 行出力し、std::fmtで説明されている 書式設定を適用します。format!(format, ..)はprintln!と同様に動作しますが、結果を 文字列として返します。dbg!(expression)は式の値をログに出力し、それを返します。todo!()はコードの一部を未実装として示します。実行されると panic します。
// Copyright 2023 Google LLC // SPDX-License-Identifier: Apache-2.0 fn factorial(n: u32) -> u32 { let mut product = 1; for i in 1..=n { product *= dbg!(i); } product } fn fizzbuzz(n: u32) -> u32 { todo!() } fn main() { let n = 4; println!("{n}! = {}", factorial(n)); }
このセクションの要点は、このような一般的で便利な機能が存在することと、その使い方です。なぜそれらがマクロとして定義されているのか、また何に展開されるのかは、特に重要ではありません。
このコースではマクロの定義は扱いませんが、後のセクションで derive マクロの使い方を説明します。
さらに調べる
標準ライブラリには、ほかにも便利なマクロがいくつも用意されています。さらに知りたい学生と共有できる、ほかの例をいくつか挙げます。
assert!と関連するマクロは、コードにアサーションを追加するために使用できます。 これらはテストを書く際に多用されます。unreachable!は、制御フローの中で決して到達しないはずの分岐を示すために使用されます。eprintln!を使うと stderr に出力できます。