マクロ

マクロはコンパイル時に 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 に出力できます。