如何在Rust中为自定义HashMap宏添加可选尾逗号支持?
解决Rust HashMap宏支持末尾可选逗号的问题
要让你的hashmap!宏支持末尾可选逗号,有两种简洁的实现方式:
方法一:修改重复模式直接支持
在宏的匹配规则里,给重复模式添加可选的末尾逗号声明$(,)?),这样就能同时匹配带或不带末尾逗号的输入:
macro_rules! hashmap { ($($key:expr => $val:expr),* $(,)?) => { { let mut map = ::std::collections::HashMap::new(); $(map.insert($key, $val);)* map } }; }
这里的$(,)?)表示允许在所有重复项的末尾添加一个可选的逗号,完全兼容两种调用方式:
hashmap!{ 1 => String::from("1"), 2 => String::from("2") };hashmap!{ 1 => String::from("1"), };
方法二:添加分支匹配末尾逗号
另一种方式是新增一个匹配规则,专门处理带末尾逗号的情况,然后将其转发到原有的规则上:
macro_rules! hashmap { ($($key:expr => $val:expr),*) => { { let mut map = ::std::collections::HashMap::new(); $(map.insert($key, $val);)* map } }; // 匹配带末尾逗号的情况,转发到无末尾逗号的规则 ($($key:expr => $val:expr),*,) => { hashmap!($($key => $val),*) }; }
为什么你之前的尝试报错?
Rust宏的语法里,?不是用来表示“可选”的符号,(,)?这种写法不符合macro_rules的重复语法规范。必须使用宏系统规定的$(...)包裹可选部分,或者通过多分支匹配来实现需求。
内容的提问来源于stack exchange,提问作者Boyar
相关产品推荐
相关产品推荐

