程式碼中的名稱與正在使用的名稱

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;