首頁 > 軟體

Rust use關鍵字妙用及模組內容拆分方法

2022-09-20 22:02:34

前言

書接上文,本篇補充rust 組織管理中模組的細節知識,比如模組拆分。此外介紹use關鍵字的習慣用法,快速參照自定義模組內容或標準庫,以此優化程式碼書寫。

1、rust 中的use關鍵字

如果我說use與C/C++中的include或者是java、python中的import用法類似,想必此時的你定是頭一歪,腦子裡蹦出兩個字——拿捏。沒錯,看完本篇文章心裡會更加敞亮,變得自信滿滿。

1.1、將模組識別符號引入當前作用域

  • use 關鍵字能夠將模組識別符號引入當前作用域
  • 但是謹記引入的時候也遵循私有許可權的原則

例如:

mod front_of_house{
    pub mod hosting{
        pub fn add_to_waitlist(){}
        fn some_fun(){}
    }
}

use crate::front_of_house::hosting;

pub fn eat_at_restaurant(){
    hosting::add_to_waitlist();
    hosting::add_to_waitlist();
    hosting::some_fun();
}//這裡並不能使用some_fun()函數,是報錯內容

我們可以看到front_of_house模組中巢狀了一個公共模組hosting,但是我們知道公共模組裡的內容也需要有pub修飾才能被呼叫。因此沒有加pub關鍵字的第二個函數無法被呼叫,這就是遵循私有許可權的體現。

1.2、use特點與習慣用法

我們習慣這樣使用 use:

1.不直接引入具體的函數或者方法

  • 我們可以這樣引入具體函數:use crate::front_of_house::hosting::add_to_waitlist;
  • 當程式碼比較多的時候,我們很難區分一個函數是本地自定義還是參照,因此不具體參照

2.參照函數或者方法最近的父模組

  • 不必參照最外層,以免程式碼冗餘

3.對於struct、enum 等函數以外的內容需要指定到完整路徑(本身)

  • 引入過後直接使用即可

例如:

use std::collections::HashMap;
fn main() {
    let mut map=HashMap::new();
    map.insert(1, 2);
    println!("{:?}",map);
}
//列印結果:{1,2}

如果一個型別在不同的模組中都有,那麼就要引入到父模組(同名條目)

例如:

use std::fmt;
use std::io;

fn f1()->fmt::Result{}
fn f2()->io ::Result{}

5.針對同名條目可以使用as關鍵字來重新命名型別

  • 指定到完整路徑,給其中一個改名即可

例如:

use std::fmt::Result;
use std::io::Result as IOResult;

fn f1()-> Result<>{}
fn f2()-> IOResult<>{}

1.3、使用pub use 重新匯出名稱

  • 使用 use 將路徑(名稱)匯入到作用域後,該名稱在此作用域預設是私有的,外部無法存取
  • pub use:重匯出
    • 將條目引入作用域
    • 該條目可以被外部程式碼引入到自己的作用域

1.4、使用外部包(package)以及標準庫

  • Cargo.toml 新增依賴的包
  • 通過該網站自動下載資源:https://crates.io/
  • 但是預設網站是在國外,需要更換國內映象
  • 這些內容在此專欄有文章講的比較詳細,不理解可以去翻閱一下

2.使用use將特定條目引入作用域

3.標準庫(std)也被當作外部包

  • 無需修改Cargo.toml來包含std
  • 但是需要用 use 將 std 中的特定條目引入到當前作用域

1.5、使用巢狀路徑清理大量 use 語句

當使用同一個包或模組下的多個條目時:

  • 使用巢狀路徑在同一行內將多個條目引入
  • 路徑相同的部分::{路徑差異的部分}

例如:

use std::io;
use std::cmp::Ordering;

use std::{io,cmp::Ordering};
//前兩行可用最後一行替代
  • 如果包含自身,需要使用self

例如:

use std::io;
use std::io::Write;

use std::io::{self,Write};
//依然是最後一行可替換前兩行

1.6、萬用字元 *

  • 使用*可以把路徑中所有的公共條目都引入到作用域
  • 需要謹慎使用,作用場景:
  • 測試:將所有被測試程式碼引入到 tests 模組(後續文章會有)
  • 有時被用於預匯入(prelude)模組

2、模組內容拆分

將模組拆分為不同檔案:

  • 模組定義時,如果模組名後面是;而不是程式碼塊:
  • Rust 會從與模組同名的檔案中載入內容,例如:

此時的lib.rs裡不會報錯,編譯器看到mod front_of_house; 會在根目錄src處找到front_of_house資料夾裡的hosting.rs檔案,使用pub use將函數引入到當前作用域(必須嚴格按照圖示建立資料夾和檔案)

  • 模組樹的結構不會發生變化

隨著模組逐漸變大,該技術讓你可以把模組的內容移動到其他檔案中

到這裡 rust 的組織管理算是徹底告一段落了,這塊內容不多,但是理解起來還是要下點功夫的

到此這篇關於Rustuse關鍵字妙用|模組內容拆分的文章就介紹到這了,更多相關Rustuse關鍵字內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com