我正在尝试创建一个简单的宏来调用vec!
,无论它接收到什么,然后在返回新向量之前做一些简单的处理:
macro_rules! sorted_vec {
($x:expr) => {
{
let v = vec![$x];
v.sort();
v
}
}
}
问题是我的宏试图解析语法,所以它抱怨逗号等等。这是有道理的,但我不知道如何解决它。我认为expr
不是正确的片段说明符。如何在没有处理的情况下将原始输入传递给vec!
?
你想要的片段说明符是tt
(令牌树)。 tt
只是一个任意有效的生锈标记,如关键字或操作符或括号/块/方括号内部任意tt
s。结合可变参数宏,您将获得可以直接传递给另一个宏的无限令牌
macro_rules! sorted_vec {
($($x:tt)*) => {
{
let mut v = vec![$($x)*];
v.sort();
v
}
}
}