Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

% 繰り返しの置換

macro_rules! replace_expr {
    ($_t:tt $sub:expr) => {$sub};
}

このパターンでは、マッチした繰り返しシーケンスを単に破棄し、その変数を代わりに使って、入力とは長さの点でのみ関係する何らかの繰り返しパターンを駆動します。

たとえば、12 個を超える要素を持つタプルのデフォルトインスタンスを構築する場合を考えてみましょう(Rust 1.2 時点での上限)。

#![allow(unused)]
fn main() {
macro_rules! tuple_default {
    ($($tup_tys:ty),*) => {
        (
            $(
                replace_expr!(
                    ($tup_tys)
                    Default::default()
                ),
            )*
        )
    };
}

macro_rules! replace_expr {
    ($_t:tt $sub:expr) => {$sub};
}

assert_eq!(tuple_default!(i32, bool, String), (0, false, String::new()));
}

JFTE: 単に $tup_tys::default() を使うこともできました

ここでは、マッチした型を実際に使っているわけではありません。代わりに、それらを捨て、単一の繰り返される式で置き換えています。別の言い方をすると、型が何であるかは気にせず、いくつあるかだけを気にしています。