0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Effective-Rustlings-jp】Day 18:分別を持ってマクロを使おう

Last updated at Posted at 2025-01-23

はじめに

こんにちは。細々とプログラミングをしているsotanengelです。
この記事は以下の記事の連載です。

他の連載記事 (詳細)

また本記事はEffective Rust(David Drysdale (著), 中田 秀基 (翻訳))を参考に作成されております。とてもいい書籍ですので興味を持った方は、ぜひ読んでみてください!

今日の内容

概要

Rustでもメタプログラミングをマクロを使うことで実現することができます。
特に以下の状況の時にマクロを使うことが推奨されます。

  • 同じコードを繰り返し書いているとき→マクロ
  • 複数の型に同じコードを書いているとき→トレイト制約を持つジェネリクス
  • 特定の型の複数の値に対して全く同じ処理を書いているとき→共有関数

例文を解くことでマクロの使い方や注意点を確認しましょう。

マクロの定義の順番は気をつけよう

問(リンク)

マクロを定義する場合には順番に気をつける必要があります。

コード (詳細)
fn main() {
    // マクロを呼び出す
    print_hello!();
}

// TODO: 宣言的マクロの定義の位置は配慮する必要があります。
//       適切な場所に配置し直してください。
macro_rules! print_hello {
    () => {
        println!("Hello, world!");
    };
}

解答(リンク)

コード参照。

コード (詳細)
// 宣言的マクロを定義する
macro_rules! print_hello {
    () => {
        println!("Hello, world!");
    };
}

fn main() {
    // マクロを呼び出す
    print_hello!();
}

マクロの中で使う変数を適切に定義しよう

問(リンク)

マクロ内部で使用するローカル変数を定義する方法を確認しましょう。

コード (詳細)

解答(リンク)

コード参照。

コード (詳細)
// 宣言的マクロを定義する
macro_rules! print_value {
    ($x:expr) => {
        println!("The value is: {}", $x);
    };
}

fn main() {
    let x = 42;

    // マクロを呼び出す
    print_value!(x);
}

さいごに

もしも本リポジトリで不備などあれば、リポジトリのissueやPRなどでご指摘いただければと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?