为什么这个生锈的HashMap宏不再起作用?

时间:2014-06-18 03:32:35

标签: rust

我之前使用过:

#[macro_export]
macro_rules! map(
  { T:ident, $($key:expr => $value:expr),+ } => {
    {
      let mut m = $T::new();
      $(
        m.insert($key, $value);
      )+
      m
    }
 };
)

创建对象,如下所示:

let mut hm = map! {HashMap, "a string" => 21, "another string" => 33};

然而,这似乎不再起作用。编译器报告:

- Failed:
macros.rs:136:24: 136:31 error: no rules expected the token `HashMap`
macros.rs:136     let mut hm = map! {HashMap, "a string" => 21, "another string" => 33};
                                     ^~~~~~~

宏观定义改变了什么使得它不再起作用?

以下基本示例运行良好:

macro_rules! foo(
  {$T:ident} => { $T; };
)

struct Blah;

#[test]
fn test_map_create() {
  let mut bar = foo!{Blah};
}

所以这似乎是对{T:ident,$(...),+}扩展如何处理的一些改变?

这里发生了什么?

1 个答案:

答案 0 :(得分:8)

$之前缺少T符号。