您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)Rust模塊怎么用,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
本文適用于剛開(kāi)始學(xué)習(xí)rust的同學(xué),用于幫助理解rust模塊間是如何相互引用的。本文盡量用極少的代碼來(lái)演示,即便之前沒(méi)有了解過(guò)rust也可以混個(gè)眼熟。用的時(shí)候可以有個(gè)印象。
如果你之前沒(méi)有了解過(guò)rust,只需要知道:Cargo-依賴管理工具,類似于npm,Cargo 使用文件放置約定,即文件名就是模塊名。crate-集裝箱,是一組功能的封裝,類似于npm包。
本文探討的場(chǎng)景是在項(xiàng)目中對(duì)代碼進(jìn)行不同程度的文件拆分和模塊抽離時(shí),往往需要在一個(gè)文件中引入另一個(gè)模塊的部分代碼,在javascript中,我們可以通過(guò)導(dǎo)入導(dǎo)出來(lái)使用其他模塊的代碼,這個(gè)過(guò)程我們只需要關(guān)心導(dǎo)入路徑是否正確。
export const name= xx import lodash from './lodash'
而在rust中,模塊不再通過(guò)文件路徑的方式引入,而是通過(guò)cargo以及約定的模塊聲明方式來(lái)構(gòu)建模塊樹(shù),然后通過(guò)use關(guān)鍵字來(lái)使用。但是rust的文檔在文件拆分和模塊使用上做的示例不太詳細(xì),于是就參考一些發(fā)布的crate的組織方式進(jìn)行了梳理。
假如我們想實(shí)現(xiàn)一個(gè)加法模塊,并提供給其他地方使用。我們可以有如下三種組織方式
Cargo 使用文件放置約定,因此模塊查找以src目錄下的rs文件或者目錄為準(zhǔn),并且只會(huì)查找一級(jí),嵌套文件夾下的rs文件不可以直接被其他文件使用。
我們可以通過(guò)在src下添加模塊名同名的文件,cargo就可以識(shí)別到add模塊。
├── Cargo.lock ├── Cargo.toml ├── src │ ├── add.rs │ ├── lib.rs
如果模塊是文件夾,則必須有mod.rs文件。這類似于javascript的index.js。cargo仍然可以識(shí)別到這是add模塊
├── Cargo.lock ├── Cargo.toml ├── src │ ├── add │ │ ├── mod.rs │ ├── lib.rs
假設(shè)我們的代碼內(nèi)容如下,并位于文件add.rs 或者add/mod.rs內(nèi)
pub fn add_fn(a: i32, b: i32) -> i32 { a + b }
那么在lib.rs中我們可以通過(guò)如下方式調(diào)用我們的add模塊
// 聲明模塊并引用模塊內(nèi)的函數(shù) mod add; pub use crate::add::add_fn; pub fn test_lib() { add_fn(1,2); }
這種方式的目錄結(jié)構(gòu)看起來(lái)像下面這樣
├── Cargo.lock ├── Cargo.toml ├── src │ ├── add │ │ └── add_m.rs │ ├── add.rs // index.js │ ├── lib.rs
add.rs負(fù)責(zé)入口模塊的導(dǎo)入導(dǎo)出,add文件夾下則存放其余相關(guān)聯(lián)的其他模塊。這類似于javascript的index.js統(tǒng)一導(dǎo)出了多個(gè)其他模塊。和上面不同的是這里 導(dǎo)入使用到了mod關(guān)鍵字來(lái)拆分模塊;
文件內(nèi)容看起來(lái)像下面這樣
add.rs
pub mod add_m; // 類似于 export * from './validate; export * from './helper'
add/add_m.rs
pub fn add_fn(a: i32, b: i32) -> i32 { a + b }
lib.rs
mod add; pub use crate::add::add_m::add_fn; pub fn test_lib() { add_fn(1,2); }
上述三種方式使用較多的應(yīng)該是前兩種,并且在大型項(xiàng)目?jī)?nèi)第二種更為合理,可以更好的組織文件。那么當(dāng)一個(gè)模塊文件夾下拆分多個(gè)模塊文件時(shí)該怎調(diào)用相鄰文件呢?
我們調(diào)整目錄結(jié)構(gòu)如下
├── Cargo.lock ├── Cargo.toml ├── src │ ├── add │ │ ├── mod.rs │ │ ├── print.rs │ │ └── user.rs // user會(huì)調(diào)用print的方法 │ ├── lib.rs
在add模塊下多了print和user。user會(huì)調(diào)用print的方法。
print.rs
pub mod my_print { pub fn print_hello() { println!( hello ) } } // 這里的pub mod 可以簡(jiǎn)單理解為ts的declare module ,里面是module的可用屬性 // declare module my_print { // export function print_hello(): string; // }
user.rs
use super::print::my_print; pub fn hello_user() { my_print::print_hello(); } pub struct User { pub name: String, }
同模塊下的文件互相引用使用super關(guān)鍵字。
mod.rs
// mod.rs為入口文件, 下面用mod聲明會(huì)先去同文件夾下查找同名文件,如果沒(méi)有則看是否有滿足條件 的同名文件夾 // 例如 add 文件夾下沒(méi)有print.rs 則查找是否有print文件夾并且文件夾下有mod.rs。 mod print; mod user; // 因?yàn)槭峭粋€(gè)模塊文件夾下,并且在入口文件使用,所以這里應(yīng)self pub use self::user::hello_user; pub use self::user::User; pub mod add_fn { // use super::*; 如果有這行,則下面不用每次調(diào)用super pub fn add(a: i32, b: i32) -> i32 { // 注意這里super關(guān)鍵字,因?yàn)閔ello_user是在另一個(gè)模塊聲明的,模塊間不能直接調(diào)用所以需要使用super來(lái)從模塊根進(jìn)行查找調(diào)用 super::hello_user(); let value = super::User { name: String::from( Rust ), }; println!( user name {} , value.name); a + b } } pub fn test_out_ref() { // 這里不在需要super因?yàn)椴辉趍od內(nèi)定義 hello_user(); }
我們新增一個(gè)模塊multip,返回兩個(gè)數(shù)相乘的結(jié)果,目錄結(jié)構(gòu)如下
├── Cargo.lock ├── Cargo.toml ├── src │ ├── add │ │ ├── mod.rs │ │ ├── print.rs │ │ └── user.rs // user會(huì)調(diào)用print的方法 │ ├── multip // ------- 新增這個(gè)模塊 │ │ ├── mod.rs法 │ ├── lib.rs
multip/mod.rs
pub fn res_multip(a: i32, b: i32) -> i32 { a * b }
假設(shè)add文件引入multip
mod print; mod user; pub use self::user::hello_user; pub use self::user::User; // 新增下面這行 use crate::multi::multip;
如此便可以使用另一個(gè)模塊的內(nèi)容了。當(dāng)然其他模塊的相互引用方式一致。
關(guān)于“Rust模塊怎么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。