代码中的名称与正在使用的名称

use 语句中名称的双冒号语法类似于代码中其他位置使用的名称,但这些路径的含义不同。

默认情况下,use 语句中的名称被解释为绝对名称,从 crate root 开始。代码中其他位置的名称与当前模块有关。

该声明:

use std::fs::File;

在包的主文件和模块中具有相同的含义。另一方面,诸如 std::fs::File::open() 之类的函数名称仅在包的主文件中引用 Rust 的标准库,因为代码中的名称是相对于当前模块的。

fn main() {
    std::fs::File::open("example"); // OK
}

mod my_module {
   fn my_fn() {
       // Error! It means my_module::std::fs::File::open()
       std::fs::File::open("example"); 

       // OK. `::` prefix makes it absolute 
       ::std::fs::File::open("example"); 

       // OK. `super::` reaches out to the parent module, where `std` is present
       super::std::fs::File::open("example"); 
   } 
}

要使 std::…名称的行为与你可以添加的 crate 根目录相同:

use std;

相反,你可以通过在 selfsuper 关键字前加上 use 路径:

 use self::my_module::my_fn;