關(guān)于rust的模塊引入問(wèn)題
國(guó)慶第一次學(xué)習(xí),真是太罪惡了,555
主要還是看這個(gè)官網(wǎng)學(xué)的,這一部分對(duì)應(yīng)的是官網(wǎng)上那個(gè)教程的第七章,寫的實(shí)在是讓人有點(diǎn)費(fèi)解,所以我這邊自己寫一下,當(dāng)然范圍限制在第七章,因?yàn)槲視簳r(shí)只是看到哪里
Rust 語(yǔ)言是一種高效、可靠的通用高級(jí)語(yǔ)言。其高效不僅限于開(kāi)發(fā)效率,它的執(zhí)行效率也是令人稱贊的,是一種少有的兼顧開(kāi)發(fā)效率和執(zhí)行效率的語(yǔ)言。
Rust 語(yǔ)言由 Mozilla 開(kāi)發(fā),最早發(fā)布于 2014 年 9 月。Rust 的編譯器是在 MIT License 和 Apache License 2.0 雙重協(xié)議聲明下的免費(fèi)開(kāi)源軟件。截至目前( 2020 年 1 月)最新的編譯器版本是 1.41.0。
Rust語(yǔ)言的特點(diǎn)
高性能 - Rust 速度驚人且內(nèi)存利用率極高。由于沒(méi)有運(yùn)行時(shí)和垃圾回收,它能夠勝任對(duì)性能要求特別高的服務(wù),可以在嵌入式設(shè)備上運(yùn)行,還能輕松和其他語(yǔ)言集成。
可靠性 - Rust 豐富的類型系統(tǒng)和所有權(quán)模型保證了內(nèi)存安全和線程安全,讓您在編譯期就能夠消除各種各樣的錯(cuò)誤。
生產(chǎn)力 - Rust 擁有出色的文檔、友好的編譯器和清晰的錯(cuò)誤提示信息, 還集成了一流的工具 —— 包管理器和構(gòu)建工具, 智能地自動(dòng)補(bǔ)全和類型檢驗(yàn)的多編輯器支持, 以及自動(dòng)格式化代碼等等。
Rust的應(yīng)用
Rust 語(yǔ)言可以用于開(kāi)發(fā):
- 傳統(tǒng)命令行程序 - Rust 編譯器可以直接生成目標(biāo)可執(zhí)行程序,不需要任何解釋程序。
- Web 應(yīng)用 - Rust 可以被編譯成 WebAssembly,WebAssembly 是一種 JavaScript 的高效替代品。
- 網(wǎng)絡(luò)服務(wù)器 - Rust 用極低的資源消耗做到安全高效,且具備很強(qiáng)的大規(guī)模并發(fā)處理能力,十分適合開(kāi)發(fā)普通或極端的服務(wù)器程序。
- 嵌入式設(shè)備 - Rust 同時(shí)具有JavaScript 一般的高效開(kāi)發(fā)語(yǔ)法和 C 語(yǔ)言的執(zhí)行效率,支持底層平臺(tái)的開(kāi)發(fā)。
書上給了很多概念啊,比如什么crate,mod之類的,我這邊實(shí)際一點(diǎn),寫一個(gè)叫school的包,這個(gè)包分成三個(gè)模塊,分別是teacher、student、worker,最終我在main.rs當(dāng)中要調(diào)用teacher包當(dāng)中的一個(gè)函數(shù),就這么簡(jiǎn)單,下面看一下我的結(jié)構(gòu)

很簡(jiǎn)單啊,src一個(gè)主要的main.rs,其他四個(gè)文件都在school文件夾下面。
worker.rs文件,簡(jiǎn)單看一下
pub mod male_worker {
pub fn male_worker_num() -> i32 {
8
}
}pub修飾符代表這個(gè)文件是外部可訪問(wèn)的,mod實(shí)際上是創(chuàng)建了一個(gè)命名空間,里面隨便寫了個(gè)函數(shù),返回了8,這個(gè)數(shù)字。這里需要注意一下worker.rs本身就相當(dāng)于一個(gè)同名的命名空間,這一點(diǎn)在引入的時(shí)候會(huì)有體現(xiàn)。
student.rs看一下
pub fn student_num() -> i32 {
// 代表我這里是120個(gè)學(xué)生
120
}挺簡(jiǎn)單的,實(shí)際上就是在student mod之中創(chuàng)建一個(gè)公開(kāi)的函數(shù),返回一個(gè)值,還是要著重一下,student.rs本身就是一個(gè)同名mod
teacher.rs看一下
// 創(chuàng)建一個(gè)新的mod嵌套
pub mod female_student {
pub fn female_student_num() -> i32 {
10
}
}
//嘗試一下引入我們的student模塊
pub fn total() -> i32 {
// 1.絕對(duì)路徑引入 這個(gè)路徑
let student_num1 = crate::school::student::student_num();
// 2.使用self進(jìn)行相對(duì)路徑的引入
// 我們用self引入一下mod female_student的內(nèi)容
let female_student = self::female_student::female_student_num();
//演示一下super的用法,super就是當(dāng)前目錄的父親級(jí)別的目錄,也是就是self的父親級(jí)別
let student_num2 = super::student::student_num();
// 3.當(dāng)引入路徑又臭又長(zhǎng)的時(shí)候我們可以使用use關(guān)鍵詞,將最后一個(gè)模塊直接作為包的名字
use crate::school::woker::male_worker;
// use crate::school::worker::male_worker as 男性員工;
// 上面是一個(gè)別名設(shè)置
// 這個(gè)male_worker就變成了這么大一長(zhǎng)串的別名
let male_worker_num = male_worker::male_worker_num();
let eqa = student_num1 == student_num2;
println!("兩種測(cè)試方式取出的數(shù)是否相等:{}", eqa);
student_num1 + student_num2 + female_student + male_worker_num
}比較長(zhǎng)啊,實(shí)際上我用數(shù)字標(biāo)了,整體上就是三個(gè)部分:
第一部分是一個(gè)絕對(duì)路徑的引入
let student_num1 = crate::school::student::student_num();
這里的絕對(duì)路徑不是我們一般的“/”,而是crate關(guān)鍵詞開(kāi)頭,那么這個(gè)crate具體指的是啥呢,其實(shí),我認(rèn)為就是src文件夾,這里可以再看一下上面的項(xiàng)目結(jié)構(gòu),這里是要取student(student.rs)模塊之中的函數(shù)的返回值,當(dāng)然要注意一點(diǎn),中間間隔的這些名稱不是文件夾,而是模塊。
第二部分是相對(duì)路徑的引入
let female_student = self::female_student::female_student_num();
//演示一下super的用法,super就是當(dāng)前目錄的父親級(jí)別的目錄,也是就是self的父親級(jí)別
let student_num2 = super::student::student_num();這里是兩種情況,首先是self開(kāi)頭的相對(duì)路徑,實(shí)際上就是指的本模塊,請(qǐng)問(wèn)根據(jù)上面的teacher.rs,這里的self指的是誰(shuí)?
再看一下文件,teacher.rs實(shí)際上是由一個(gè)叫total的函數(shù)和模塊female_student組成的,這個(gè)self在total函數(shù)中,當(dāng)然指的是teacher這個(gè)模塊啦,female_student是teacher的子模塊,接下來(lái)就好理解了。
在第二種情況中,super指的就是當(dāng)前self的父模塊,實(shí)際就是school,實(shí)際使用上來(lái)看:mod申明的是個(gè)模塊,rs文件是個(gè)模塊,school文件夾也是模塊啦
第三部分看一下use關(guān)鍵詞
use crate::school::woker::male_worker;
// use crate::school::worker::male_worker as 男性員工;
// 上面是一個(gè)別名設(shè)置
// 這個(gè)male_worker就變成了這么大一長(zhǎng)串的別名
let male_worker_num = male_worker::male_worker_num();本質(zhì)上就是這樣模塊化的寫法太長(zhǎng),使用use將長(zhǎng)串模塊的最后一個(gè)名稱作為整體的名稱,當(dāng)然也可以使用as的方式創(chuàng)建別名
main.rs拿到模塊中的值
teacher.rs返回了一個(gè)i32的值,那這個(gè)值要怎么拿到呢,看一下上面的項(xiàng)目結(jié)構(gòu),我們有一個(gè)mod.rs的文件如下
pub mod student; pub mod teacher; pub mod woker;
這個(gè)文件夾的創(chuàng)立是為了申明school文件夾本身是個(gè)大模塊,同時(shí)也是為了讓main.rs找到school模塊,并使用里面的函數(shù),這里的mod就不是申明模塊了,而是引入模塊。我們看一下main.rs如何引入
fn main() {
// 嘗試一下引入函數(shù)
let total = school::teacher::total();
println!("{}", total);
}
mod school;
這里也有一個(gè)mod school作用和上面一樣,引入已經(jīng)申明的模塊,運(yùn)行一下也是成功的

總結(jié)一下就以下幾個(gè)問(wèn)題:
1.哪些部分能叫模塊(文件夾、rs文件、文件中的mod申明)
2.mod關(guān)鍵詞啥作用(文件中申明模塊,引入模塊)
3.use和pub關(guān)鍵詞(縮短路徑,外部獲?。?/p>
4.相對(duì)和絕對(duì)路徑如何拿到模塊中的值(self,super)
當(dāng)然,初學(xué)還是有點(diǎn)不太懂的,當(dāng)個(gè)建議記錄看看就行
到此這篇關(guān)于rust的模塊引入的文章就介紹到這了,更多相關(guān)rust模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Rust 語(yǔ)言中的dyn 關(guān)鍵字及用途解析
在Rust中,"dyn"關(guān)鍵字用于表示動(dòng)態(tài)分發(fā)(dynamic dispatch),它通常與trait對(duì)象一起使用,以實(shí)現(xiàn)運(yùn)行時(shí)多態(tài), 在Rust中,多態(tài)是通過(guò)trait和impl來(lái)實(shí)現(xiàn)的,這篇文章主要介紹了Rust 語(yǔ)言中的 dyn 關(guān)鍵字,需要的朋友可以參考下2024-03-03
libbpf和Rust開(kāi)發(fā)ebpf程序?qū)崙?zhàn)示例
這篇文章主要為大家介紹了libbpf和Rust開(kāi)發(fā)ebpf程序?qū)崙?zhàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12

