最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入講解下Rust模塊使用方式

 更新時(shí)間:2022年03月05日 10:42:32   作者:字節(jié)教育  
很多時(shí)候,我們寫的代碼需要按模塊組織,因?yàn)槲覀儫o法將大量的代碼都寫在一個(gè)文件上,那樣不容易維護(hù),下面這篇文章主要給大家介紹了關(guān)于Rust模塊使用方式的相關(guān)資料,需要的朋友可以參考下

前言

本文適用于剛開始學(xué)習(xí)rust的同學(xué),用于幫助理解rust模塊間是如何相互引用的。本文盡量用極少的代碼來演示,即便之前沒有了解過rust也可以混個(gè)眼熟。用的時(shí)候可以有個(gè)印象。

如果你之前沒有了解過rust,只需要知道:Cargo-依賴管理工具,類似于npm,Cargo 使用文件放置約定,即文件名就是模塊名。crate-集裝箱,是一組功能的封裝,類似于npm包。

本文探討的場(chǎng)景是在項(xiàng)目中對(duì)代碼進(jìn)行不同程度的文件拆分和模塊抽離時(shí),往往需要在一個(gè)文件中引入另一個(gè)模塊的部分代碼,在javascript中,我們可以通過導(dǎo)入導(dǎo)出來使用其他模塊的代碼,這個(gè)過程我們只需要關(guān)心導(dǎo)入路徑是否正確。

export const name= xx 
import lodash from './lodash'

而在rust中,模塊不再通過文件路徑的方式引入,而是通過cargo以及約定的模塊聲明方式來構(gòu)建模塊樹,然后通過use關(guān)鍵字來使用。但是rust的文檔在文件拆分和模塊使用上做的示例不太詳細(xì),于是就參考一些發(fā)布的crate的組織方式進(jìn)行了梳理。

模塊聲明&使用

假如我們想實(shí)現(xiàn)一個(gè)加法模塊,并提供給其他地方使用。我們可以有如下三種組織方式

Cargo 使用文件放置約定,因此模塊查找以src目錄下的rs文件或者目錄為準(zhǔn),并且只會(huì)查找一級(jí),嵌套文件夾下的rs文件不可以直接被其他文件使用。

方法一:直接在根文件下聲明 add.rs

我們可以通過在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中我們可以通過如下方式調(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)看起來像下面這樣

├── 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)鍵字來拆分模塊;

文件內(nè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ì)先去同文件夾下查找同名文件,如果沒有則看是否有滿足條件   的同名文件夾
// 例如 add 文件夾下沒有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來從模塊根進(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的模塊使用方式總體來說是比較簡(jiǎn)單的,由于官方文檔在模塊拆分和組織上并沒有進(jìn)行較完善的說明,所以對(duì)于剛從js轉(zhuǎn)到rust學(xué)習(xí)的同學(xué)可能會(huì)有一點(diǎn)不適應(yīng)。通過前面內(nèi)容已經(jīng)較為清晰的梳理了下使用方式。希望可以對(duì)需要的同學(xué)有所幫助。

到此這篇關(guān)于Rust模塊使用方式的文章就介紹到這了,更多相關(guān)Rust模塊使用方式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Rust處理錯(cuò)誤的實(shí)現(xiàn)方法

    Rust處理錯(cuò)誤的實(shí)現(xiàn)方法

    程序在運(yùn)行的過程中,總是會(huì)不可避免地產(chǎn)生錯(cuò)誤,而如何優(yōu)雅地解決錯(cuò)誤,也是語言的設(shè)計(jì)哲學(xué)之一。本文就來和大家來了Rust是如何處理錯(cuò)誤的,感興趣的可以了解一下
    2023-03-03
  • 解析Rust?struct?中的生命周期

    解析Rust?struct?中的生命周期

    rust?的生命周期保證了內(nèi)存的安全性,同時(shí)也增加了開發(fā)者的心智負(fù)擔(dān)。是在上線之前多費(fèi)心思寫代碼,還是在上線以后忙忙活活查問題,這是個(gè)?trade?off?問題,這篇文章主要介紹了Rust?struct?中的生命周期,需要的朋友可以參考下
    2022-10-10
  • Rust中的Copy和Clone對(duì)比分析

    Rust中的Copy和Clone對(duì)比分析

    這篇文章主要介紹了Rust中的Copy和Clone及區(qū)別對(duì)比分析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • Rust 的 into_owned() 方法實(shí)例詳解

    Rust 的 into_owned() 方法實(shí)例詳解

    into_owned是Rust語言中std::borrow::Cow 枚舉的一個(gè)方法,into_owned確保了調(diào)用者獲得數(shù)據(jù)的獨(dú)立所有權(quán),無論Cow之前是引用還是已經(jīng)擁有數(shù)據(jù),本文給大家介紹Rust 的 into_owned() 方法,感興趣的的朋友跟隨小編一起看看吧
    2024-03-03
  • Rust cargo 命令行工具使用示例教程

    Rust cargo 命令行工具使用示例教程

    cargo 是 Rust 的構(gòu)建系統(tǒng)和包管理器,負(fù)責(zé)創(chuàng)建項(xiàng)目、編譯代碼、管理依賴、運(yùn)行測(cè)試等,是日常開發(fā)中最常用的工具,這篇文章主要介紹了Rust cargo 命令行工具使用教程,需要的朋友可以參考下
    2025-04-04
  • Rust動(dòng)態(tài)調(diào)用字符串定義的Rhai函數(shù)方式

    Rust動(dòng)態(tài)調(diào)用字符串定義的Rhai函數(shù)方式

    Rust中使用Rhai動(dòng)態(tài)調(diào)用字符串定義的函數(shù),通過eval_expression_with_scope實(shí)現(xiàn),但參數(shù)傳遞和函數(shù)名處理有局限性,使用FnCall功能更健壯,但更復(fù)雜,總結(jié)提供了更通用的方法,但需要處理更多錯(cuò)誤情況
    2025-02-02
  • Rust語言之trait中的個(gè)方法可以重寫嗎

    Rust語言之trait中的個(gè)方法可以重寫嗎

    在Rust中,trait定義了一組方法,這些方法可以被一個(gè)或多個(gè)類型實(shí)現(xiàn),當(dāng)你為某個(gè)類型實(shí)現(xiàn)一個(gè)trait時(shí),你可以為該trait中的每個(gè)方法提供自己的具體實(shí)現(xiàn),本文將給大家介紹一下trait中的個(gè)方法是否可以重寫,需要的朋友可以參考下
    2023-10-10
  • rust交叉編譯問題及報(bào)錯(cuò)解析

    rust交叉編譯問題及報(bào)錯(cuò)解析

    這篇文章主要為大家介紹了rust交叉編譯問題及報(bào)錯(cuò)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Rust中自定義Debug調(diào)試輸出的示例詳解

    Rust中自定義Debug調(diào)試輸出的示例詳解

    這篇文章主要介紹了Rust中自定義Debug調(diào)試輸出的示例詳解,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • Rust中不可變變量與const的區(qū)別詳解

    Rust中不可變變量與const的區(qū)別詳解

    Rust作者認(rèn)為變量默認(rèn)應(yīng)該是immutable,即聲明后不能被改變的變量,這一點(diǎn)是讓跨語言學(xué)習(xí)者覺得很別扭,不過這一點(diǎn)小的改變帶來了諸多好處,本節(jié)我們來學(xué)習(xí)Rust中不可變變量與const的區(qū)別,需要的朋友可以參考下
    2024-02-02

最新評(píng)論

隆化县| 新安县| 康定县| 林州市| 白玉县| 临颍县| 祁阳县| 大理市| 开封市| 潜山县| 临湘市| 泰州市| 阿拉善盟| 江阴市| 石家庄市| 定陶县| 晋江市| 故城县| 神农架林区| 秦皇岛市| 仁怀市| 红安县| 蛟河市| 黄骅市| 水富县| 义马市| 新和县| 个旧市| 泗阳县| 郁南县| 无极县| 阜阳市| 札达县| 拜泉县| 博乐市| 桐城市| 沅江市| 安岳县| 当阳市| 秀山| 怀宁县|