以 :: Rust 宏开头是什么意思

  • 本文关键字:是什么 Rust 开头 rust
  • 更新时间 :
  • 英文 :


我看到宏代码就在下面。

::作为陈述的第一个,它是什么意思?

:: 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

最新更新