首頁 > 軟體

關於rust的模組引入問題

2022-10-10 14:01:18

國慶第一次學習,真是太罪惡了,555

主要還是看這個官網學的,這一部分對應的是官網上那個教學的第七章,寫的實在是讓人有點費解,所以我這邊自己寫一下,當然範圍限制在第七章,因為我暫時只是看到哪裡

Rust 語言是一種高效、可靠的通用高階語言。其高效不僅限於開發效率,它的執行效率也是令人稱讚的,是一種少有的兼顧開發效率和執行效率的語言。

Rust 語言由 Mozilla 開發,最早釋出於 2014 年 9 月。Rust 的編譯器是在 MIT License 和 Apache License 2.0 雙重協定宣告下的免費開源軟體。截至目前( 2020 年 1 月)最新的編譯器版本是 1.41.0。

Rust語言的特點

  • 高效能 - Rust 速度驚人且記憶體利用率極高。由於沒有執行時和垃圾回收,它能夠勝任對效能要求特別高的服務,可以在嵌入式裝置上執行,還能輕鬆和其他語言整合。

  • 可靠性 - Rust 豐富的型別系統和所有權模型保證了記憶體安全和執行緒安全,讓您在編譯期就能夠消除各種各樣的錯誤。

  • 生產力 - Rust 擁有出色的檔案、友好的編譯器和清晰的錯誤提示資訊, 還整合了一流的工具 —— 包管理器和構建工具, 智慧地自動補全和型別檢驗的多編輯器支援, 以及自動格式化程式碼等等。

Rust的應用

Rust 語言可以用於開發:

  • 傳統命令列程式 - Rust 編譯器可以直接生成目標可執行程式,不需要任何解釋程式。
  • Web 應用 - Rust 可以被編譯成 WebAssembly,WebAssembly 是一種 JavaScript 的高效替代品。
  • 網路伺服器 - Rust 用極低的資源消耗做到安全高效,且具備很強的大規模並行處理能力,十分適合開發普通或極端的伺服器程式。
  • 嵌入式裝置 - Rust 同時具有JavaScript 一般的高效開發語法和 C 語言的執行效率,支援底層平臺的開發。

書上給了很多概念啊,比如什麼crate,mod之類的,我這邊實際一點,寫一個叫school的包,這個包分成三個模組,分別是teacher、student、worker,最終我在main.rs當中要呼叫teacher包當中的一個函數,就這麼簡單,下面看一下我的結構

 很簡單啊,src一個主要的main.rs,其他四個檔案都在school資料夾下面。

worker.rs檔案,簡單看一下

pub mod male_worker {
    pub fn male_worker_num() -> i32 {
        8
    }
}

pub修飾符代表這個檔案是外部可存取的,mod實際上是建立了一個名稱空間,裡面隨便寫了個函數,返回了8,這個數位。這裡需要注意一下worker.rs本身就相當於一個同名的名稱空間,這一點在引入的時候會有體現。

student.rs看一下

pub fn student_num() -> i32 {
    // 代表我這裡是120個學生
    120
}

挺簡單的,實際上就是在student mod之中建立一個公開的函數,返回一個值,還是要著重一下,student.rs本身就是一個同名mod

teacher.rs看一下

// 建立一個新的mod巢狀
pub mod female_student {
    pub fn female_student_num() -> i32 {
        10
    }
}
 
//嘗試一下引入我們的student模組
pub fn total() -> i32 {
    // 1.絕對路徑引入 這個路徑
    let student_num1 = crate::school::student::student_num();
 
    // 2.使用self進行相對路徑的引入
    // 我們用self引入一下mod female_student的內容
    let female_student = self::female_student::female_student_num();
 
    //演示一下super的用法,super就是當前目錄的父親級別的目錄,也是就是self的父親級別
    let student_num2 = super::student::student_num();
 
    // 3.當引入路徑又臭又長的時候我們可以使用use關鍵詞,將最後一個模組直接作為包的名字
    use crate::school::woker::male_worker;
    // use crate::school::worker::male_worker as 男性員工;
    // 上面是一個別名設定
    // 這個male_worker就變成了這麼大一長串的別名
    let male_worker_num = male_worker::male_worker_num();
    let eqa = student_num1 == student_num2;
    println!("兩種測試方式取出的數是否相等:{}", eqa);
    student_num1 + student_num2 + female_student + male_worker_num
}

比較長啊,實際上我用數位標了,整體上就是三個部分:

第一部分是一個絕對路徑的引入

let student_num1 = crate::school::student::student_num();

這裡的絕對路徑不是我們一般的“/”,而是crate關鍵詞開頭,那麼這個crate具體指的是啥呢,其實,我認為就是src資料夾,這裡可以再看一下上面的專案結構,這裡是要取student(student.rs)模組之中的函數的返回值,當然要注意一點,中間間隔的這些名稱不是資料夾,而是模組。

第二部分是相對路徑的引入

let female_student = self::female_student::female_student_num();
 
    //演示一下super的用法,super就是當前目錄的父親級別的目錄,也是就是self的父親級別
let student_num2 = super::student::student_num();

這裡是兩種情況,首先是self開頭的相對路徑,實際上就是指的本模組,請問根據上面的teacher.rs,這裡的self指的是誰?

再看一下檔案,teacher.rs實際上是由一個叫total的函數和模組female_student組成的,這個self在total函數中,當然指的是teacher這個模組啦,female_student是teacher的子模組,接下來就好理解了。

在第二種情況中,super指的就是當前self的父模組,實際就是school,實際使用上來看:mod申明的是個模組,rs檔案是個模組,school資料夾也是模組啦

第三部分看一下use關鍵詞

use crate::school::woker::male_worker;
    // use crate::school::worker::male_worker as 男性員工;
    // 上面是一個別名設定
    // 這個male_worker就變成了這麼大一長串的別名
    let male_worker_num = male_worker::male_worker_num();

本質上就是這樣模組化的寫法太長,使用use將長串模組的最後一個名稱作為整體的名稱,當然也可以使用as的方式建立別名

main.rs拿到模組中的值

teacher.rs返回了一個i32的值,那這個值要怎麼拿到呢,看一下上面的專案結構,我們有一個mod.rs的檔案如下

pub mod student;
pub mod teacher;
pub mod woker;

這個資料夾的創立是為了申明school資料夾本身是個大模組,同時也是為了讓main.rs找到school模組,並使用裡面的函數,這裡的mod就不是申明模組了,而是引入模組。我們看一下main.rs如何引入

fn main() {
    // 嘗試一下引入函數
    let total = school::teacher::total();
    println!("{}", total);
 
}
mod school;
 

這裡也有一個mod school作用和上面一樣,引入已經申明的模組,執行一下也是成功的

 總結一下就以下幾個問題:

1.哪些部分能叫模組(資料夾、rs檔案、檔案中的mod申明)

2.mod關鍵詞啥作用(檔案中申明模組,引入模組)

3.use和pub關鍵詞(縮短路徑,外部獲取)

4.相對和絕對路徑如何拿到模組中的值(self,super)

當然,初學還是有點不太懂的,當個建議記錄看看就行

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


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