如何在声明性宏中接受可选的尾随逗号?

问题描述

macro_rules! hashmap {
    ($($key:expr => $value:expr),*) => {
        {
            let mut _map = std::collections::HashMap::new();
            $(
                _map.insert($key,$value);
            )*
            _map
        };
    };
}

let map = hashmap! {
    "a" => 1,"b" => 2,};

我在前面的代码中定义了一个hashmap宏,我用它作为下一个显示代码,有一个问题是最后一个键值写入["b"=>2]可以很好地工作,但是像 ["b"=>2,] 这样的逗号不能编译。我想知道 Rust 宏重复匹配的正确规则是什么?

解决方法

您需要在宏模式中明确接受可选的尾随逗号:

macro_rules! hashmap {
    ($($key:expr => $value:expr),* $(,)?) => {
        // ...
    };
}