ZhangHanDong / tao-of-rust-codes

《Rust编程之道》随书源码
https://ruststudy.github.io/tao_of_rust_docs/tao_of_rust/
MIT License
1.19k stars 172 forks source link

[第十二章] 对代码清单12-29 的解释有误 #222

Open szpzs opened 5 years ago

szpzs commented 5 years ago

451页

原文:

代码清单 12-29中,在之前匹配模式“$($key:expr => $value:expr,)”的基础上,增加了“$(,)*”,变为“$($key:expr => $value:expr,)*$(,)*”。

应该改为:

代码清单 12-29中,在之前匹配模式“$($key:expr => $value:expr),*”的基础上,增加了“$(,)*”,变为“$($key:expr => $value:expr),*$(,)*”。

ZhangHanDong commented 5 years ago

@szpzs 收到。

huangjj27 commented 5 years ago

就算如此更改,这个宏还是有bug,play

#![feature(decl_macro)]

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

fn main() {
    // 可以编译通过
    let map = hashmap!{
        "a" => 1,
        "b" => 2,,,
    };
}

此外,现在nightly可以支持问号(?)匹配0或1次模式了, 可以考虑使用

ZhangHanDong commented 5 years ago

@huangjj27 新语法的代码修改放到第二版吧