rust - 将整个宏输入传递给另一个宏

标签 rust rust-macros rust-decl-macros

我正在尝试制作一个简单的宏,它调用 vec! 接收到的任何内容,然后在返回新向量之前进行一些简单的处理:

macro_rules! sorted_vec {
    ($x:expr) => {
        {
            let v = vec![$x];
            v.sort();
            v
        }
    }
}

问题是我的宏试图解析语法,所以它会提示逗号等问题。这是有道理的,但我不确定如何解决它。我认为 expr 不是要使用的正确片段说明符。我如何让它在不处理的情况下将原始输入传递给 vec!

最佳答案

您需要的片段说明符是 tt( token 树)。 tt 只是一个任意有效的 rust-token,如关键字或运算符或括号/ block /方括号,其中包含任意 tt。结合可变参数宏,您可以获得可以直接传递给另一个宏的无限标记

macro_rules! sorted_vec {
    ($($x:tt)*) => {
        {
            let mut v = vec![$($x)*];
            v.sort();
            v
        }
    }
}

关于rust - 将整个宏输入传递给另一个宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31839016/

相关文章:

multithreading - 如何跨线程共享包含发送方和接收方字段的结构?

rust - 无法将一元运算符 `-` 应用于类型 `usize`

rust - 我可以在结构体内部调用宏吗?

rust - 如何检测是否为声明性宏提供了可选关键字?

debugging - 如何查看导致编译错误的扩展宏代码?

rust - cargo 构建失败 : could not find macro `llvm_asm` in this scope

rust - 如何更改 Serde 的默认实现以返回一个空对象而不是 null?

rust - 我如何计算 Rust 宏系统中的表达式?

rust - 有没有办法在非夜间 Rust 上查看扩展的宏?

rust - 如何实现定义新公共(public)类型并返回该类型实例的宏?