6

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

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

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

4

1 回答 1

9

您想要的片段说明符是tt(令牌树)。Att只是一个任意有效的 rust-token,如关键字或运算符或带有任意tts 的括号/块/方括号。结合可变参数宏,您可以获得可以直接传递给另一个宏的无限令牌

macro_rules! sorted_vec {
    ($($x:tt)*) => {
        {
            let mut v = vec![$($x)*];
            v.sort();
            v
        }
    }
}
于 2015-08-05T17:29:35.223 回答