<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文適用於剛開始學習rust的同學,用於幫助理解rust模組間是如何相互參照的。本文儘量用極少的程式碼來演示,即便之前沒有了解過rust也可以混個眼熟。用的時候可以有個印象。
如果你之前沒有了解過rust,只需要知道:Cargo-依賴管理工具,類似於npm,Cargo 使用檔案放置約定,即檔名就是模組名。crate-集裝箱,是一組功能的封裝,類似於npm包。
本文探討的場景是在專案中對程式碼進行不同程度的檔案拆分和模組抽離時,往往需要在一個檔案中引入另一個模組的部分程式碼,在javascript中,我們可以通過匯入匯出來使用其他模組的程式碼,這個過程我們只需要關心匯入路徑是否正確。
export const name= xx import lodash from './lodash'
而在rust中,模組不再通過檔案路徑的方式引入,而是通過cargo以及約定的模組宣告方式來構建模組樹,然後通過use關鍵字來使用。但是rust的檔案在檔案拆分和模組使用上做的範例不太詳細,於是就參考一些釋出的crate的組織方式進行了梳理。
假如我們想實現一個加法模組,並提供給其他地方使用。我們可以有如下三種組織方式
Cargo 使用檔案放置約定,因此模組查詢以src目錄下的rs檔案或者目錄為準,並且只會查詢一級,巢狀資料夾下的rs檔案不可以直接被其他檔案使用。
我們可以通過在src下新增模組名同名的檔案,cargo就可以識別到add模組。
├── Cargo.lock ├── Cargo.toml ├── src │ ├── add.rs │ ├── lib.rs
如果模組是資料夾,則必須有mod.rs檔案。這類似於javascript的index.js。cargo仍然可以識別到這是add模組
├── Cargo.lock ├── Cargo.toml ├── src │ ├── add │ │ ├── mod.rs │ ├── lib.rs
假設我們的程式碼內容如下,並位於檔案add.rs 或者add/mod.rs內
pub fn add_fn(a: i32, b: i32) -> i32 { a + b }
那麼在lib.rs中我們可以通過如下方式呼叫我們的add模組
// 宣告模組並參照模組內的函數 mod add; pub use crate::add::add_fn; pub fn test_lib() { add_fn(1,2); }
這種方式的目錄結構看起來像下面這樣
├── Cargo.lock ├── Cargo.toml ├── src │ ├── add │ │ └── add_m.rs │ ├── add.rs // index.js │ ├── lib.rs
add.rs負責入口模組的匯入匯出,add資料夾下則存放其餘相關聯的其他模組。這類似於javascript的index.js統一匯出了多個其他模組。和上面不同的是這裡 匯入使用到了mod關鍵字來拆分模組;
檔案內容看起來像下面這樣
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); }
上述三種方式使用較多的應該是前兩種,並且在大型專案內第二種更為合理,可以更好的組織檔案。那麼當一個模組資料夾下拆分多個模組檔案時該怎呼叫相鄰檔案呢?
我們調整目錄結構如下
├── Cargo.lock ├── Cargo.toml ├── src │ ├── add │ │ ├── mod.rs │ │ ├── print.rs │ │ └── user.rs // user會呼叫print的方法 │ ├── lib.rs
在add模組下多了print和user。user會呼叫print的方法。
print.rs
pub mod my_print { pub fn print_hello() { println!( hello ) } } // 這裡的pub mod 可以簡單理解為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關鍵字。
mod.rs
// mod.rs為入口檔案, 下面用mod宣告會先去同資料夾下查詢同名檔案,如果沒有則看是否有滿足條件 的同名資料夾 // 例如 add 資料夾下沒有print.rs 則查詢是否有print資料夾並且資料夾下有mod.rs。 mod print; mod user; // 因為是同一個模組資料夾下,並且在入口檔案使用,所以這裡應self pub use self::user::hello_user; pub use self::user::User; pub mod add_fn { // use super::*; 如果有這行,則下面不用每次呼叫super pub fn add(a: i32, b: i32) -> i32 { // 注意這裡super關鍵字,因為hello_user是在另一個模組宣告的,模組間不能直接呼叫所以需要使用super來從模組根進行查詢呼叫 super::hello_user(); let value = super::User { name: String::from( Rust ), }; println!( user name {} , value.name); a + b } } pub fn test_out_ref() { // 這裡不在需要super因為不在mod內定義 hello_user(); }
我們新增一個模組multip,返回兩個數相乘的結果,目錄結構如下
├── Cargo.lock ├── Cargo.toml ├── src │ ├── add │ │ ├── mod.rs │ │ ├── print.rs │ │ └── user.rs // user會呼叫print的方法 │ ├── multip // ------- 新增這個模組 │ │ ├── mod.rs法 │ ├── lib.rs
multip/mod.rs
pub fn res_multip(a: i32, b: i32) -> i32 { a * b }
假設add檔案引入multip
mod print; mod user; pub use self::user::hello_user; pub use self::user::User; // 新增下面這行 use crate::multi::multip;
如此便可以使用另一個模組的內容了。當然其他模組的相互參照方式一致。
rust的模組使用方式總體來說是比較簡單的,由於官方檔案在模組拆分和組織上並沒有進行較完善的說明,所以對於剛從js轉到rust學習的同學可能會有一點不適應。通過前面內容已經較為清晰的梳理了下使用方式。希望可以對需要的同學有所幫助。
到此這篇關於Rust模組使用方式的文章就介紹到這了,更多相關Rust模組使用方式內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45