深入講解下Rust模塊使用方式
前言
本文適用于剛開(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文件不可以直接被其他文件使用。
方法一:直接在根文件下聲明 add.rs
我們可以通過(guò)在src下添加模塊名同名的文件,cargo就可以識(shí)別到add模塊。
├── Cargo.lock ├── Cargo.toml ├── src │ ├── add.rs │ ├── lib.rs
方法二:聲明add文件夾,文件夾下包含 mod.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); }
方法三:add.rs和add文件夾同時(shí)存在
這種方式的目錄結(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)然其他模塊的相互引用方式一致。
小結(jié)
rust的模塊使用方式總體來(lái)說(shuō)是比較簡(jiǎn)單的,由于官方文檔在模塊拆分和組織上并沒(méi)有進(jìn)行較完善的說(shuō)明,所以對(duì)于剛從js轉(zhuǎn)到rust學(xué)習(xí)的同學(xué)可能會(huì)有一點(diǎn)不適應(yīng)。通過(guò)前面內(nèi)容已經(jīng)較為清晰的梳理了下使用方式。希望可以對(duì)需要的同學(xué)有所幫助。
到此這篇關(guān)于Rust模塊使用方式的文章就介紹到這了,更多相關(guān)Rust模塊使用方式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Rust如何使用Sauron實(shí)現(xiàn)Web界面交互
Sauron?是一個(gè)多功能的?Web?框架和庫(kù),用于構(gòu)建客戶端和/或服務(wù)器端?Web?應(yīng)用程序,重點(diǎn)關(guān)注人體工程學(xué)、簡(jiǎn)單性和優(yōu)雅性,這篇文章主要介紹了Rust使用Sauron實(shí)現(xiàn)Web界面交互,需要的朋友可以參考下2024-03-03詳解Rust 生命周期符號(hào)使用的方法和規(guī)律
生命周期是 Rust 中處理引用和所有權(quán)的關(guān)鍵概念,通過(guò)正確使用生命周期符號(hào)和遵循相關(guān)規(guī)律,你可以編寫(xiě)出安全、高效的 Rust 代碼,這篇文章主要介紹了Rust 生命周期符號(hào)使用的方法和規(guī)律,需要的朋友可以參考下2024-03-03Go調(diào)用Rust方法及外部函數(shù)接口前置
這篇文章主要為大家介紹了Go調(diào)用Rust方法及外部函數(shù)接口前置示例實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06利用Rust編寫(xiě)一個(gè)簡(jiǎn)單的字符串時(shí)鐘
這篇文章主要為大家詳細(xì)介紹了一個(gè)用rust寫(xiě)的一個(gè)簡(jiǎn)單的練手的demo,一個(gè)字符串時(shí)鐘,在終端用字符串方式顯示當(dāng)前時(shí)間,感興趣的小伙伴可以了解一下2022-12-12Rust?編程語(yǔ)言中的所有權(quán)ownership詳解
這篇文章主要介紹了Rust?編程語(yǔ)言中的所有權(quán)ownership詳解的相關(guān)資料,需要的朋友可以參考下2023-02-02