AST 强制转换
在替换 tt
时,Rust 的解析器并不十分可靠。
当它期望得到某类特定的语法结构时,
如果摆在它面前的是一坨替换后的 tt
标记,就有可能出现问题。
解析器常常直接选择放弃解析,而非尝试去解析它们。
在这类情况中,就要用到 AST 强制转换(简称“强转”)。
#![allow(dead_code)] macro_rules! as_expr { ($e:expr) => {$e} } macro_rules! as_item { ($i:item) => {$i} } macro_rules! as_pat { ($p:pat) => {$p} } macro_rules! as_stmt { ($s:stmt) => {$s} } macro_rules! as_ty { ($t:ty) => {$t} } fn main() { as_item!{struct Dummy;} as_stmt!(let as_pat!(_): as_ty!(_) = as_expr!(42)); }
这些强制变换经常与 下推累积 宏一同使用,
以使解析器能够将最终输出的 tt
序列当作某类特定的语法结构来对待。
注意:之所以只有这几种强转宏, 是由宏 可以展开成什么 所决定的, 而不是由宏能够捕捉哪些东西所决定的。