溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Rust模塊怎么用

發(fā)布時(shí)間:2022-03-05 14:01:16 來(lái)源:億速云 閱讀:154 作者:小新 欄目:開(kāi)發(fā)技術(shù)

這篇文章將為大家詳細(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文件不可以直接被其他文件使用。

    方法一:直接在根文件下聲明 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)然其他模塊的相互引用方式一致。

    關(guān)于“Rust模塊怎么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

    向AI問(wèn)一下細(xì)節(jié)

    免責(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)容。

    AI