编写自定义格式的最佳方法是什么!宏?

neb*_*ars 3 macros rust

我正在尝试创建一个crash!基本上只是包装的自定义宏eprintln!,但它可以是任何其他format!类似的宏。目前看起来是这样的。

macro_rules! crash {
    ($fmt_str:literal, $($args:expr),*) => {{
        eprintln!($fmt_str, $args);
        std::process::exit(1);
    }};
}
Run Code Online (Sandbox Code Playgroud)

我无法$args直接使用,因为它仍在重复,所以我需要某种方法将其分开,但我不知道该怎么做。

Cha*_*man 9

当您的解决方案有效时,转发宏参数的最佳方法是将它们捕获为tt. 就您而言,由于您想要的只是转发它们,因此您可以使用$($t:tt)*

macro_rules! crash {
    ($($t:tt)*) => {{
        eprintln!($($t)*);
        std::process::exit(1);
    }};
}
Run Code Online (Sandbox Code Playgroud)

这样做的优点是完全透明,并且可以启用底层宏启用的所有功能。例如,在这种情况下,该tt版本支持早期扩展的格式字符串,而您的原始版本不支持(playground):

// crash!(concat!("a", "b")); // Does not compile
crash_tt!(concat!("a", "b"));
Run Code Online (Sandbox Code Playgroud)