我看到宏代码就在下面。
::作为陈述的第一个,它是什么意思?
:: std::集合:HashMap::新()
macro_rules! hashmap {
() => {
{
::std::collections::HashMap::new()
}
};
($($k:expr => $v:expr),*) => {
{
let mut _map = ::std::collections::HashMap::new();
$(_map.insert($k, $v);)*
_map
}
};
($($k:expr => $v:expr),+ $(,)?) => {
{
let mut _map = ::std::collections::HashMap::new();
$(_map.insert($k, $v);)*
_map
}
};
}
表示"在全局命名空间中搜索"。参考文档
它基本上意味着(在2018版及以后)不在此crate中搜索。假设我们使用不限定的std::collections::HashMap
(没有前导的::
),并且在定义std
子模块的模块中使用宏,如:
mod std;
hashmap! {}
在这种情况下,声明的std
模块将优先于先前存在的std
库,并且宏将引用它。当然,那里没有collections::HashMap
(或者更糟的是,有,但它不同于预期的HashMap
)。为了防止这种情况,我们使用::std
,这意味着"搜索crate命名为std
,不要查找具有该名称的模块。
以::
开头的路径表示在全局命名空间中搜索。由于@Chayin已经指出了文档,一个示例可能对您和未来的读者有用。当你运行这个程序时:测试程序/src/main/strong <>
mod std {
pub mod f64 {
pub mod consts {
pub const PI: f64 = 4.0;
}
}
}
macro_rules! test_mactro {
() => {{
pub mod std { pub mod f64 { pub mod consts {
pub const PI: f64 = 5.0;
}}}
println!("{}", std::f64::consts::PI);
println!("{}", ::std::f64::consts::PI);
println!("{}", self::std::f64::consts::PI);
}};
}
fn main() {
test_mactro!()
}
并查看输出:
$ cargo run
5
3.141592653589793
4