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

rust 包模塊組織結(jié)構(gòu)詳解

 更新時(shí)間:2023年12月07日 17:11:45   作者:i-neojos  
RUST提供了一系列的功能來(lái)幫助我們管理代碼,包括決定哪些細(xì)節(jié)是暴露的、哪些細(xì)節(jié)是私有的,以及不同的作用域的命名管理,這篇文章主要介紹了rust 包模塊組織結(jié)構(gòu)的相關(guān)知識(shí),需要的朋友可以參考下

一個(gè)包(package)可以擁有多個(gè)二進(jìn)制單元包及一個(gè)可選的庫(kù)單元包。隨著包內(nèi)代碼規(guī)模的增長(zhǎng),你還可以將代碼拆分到獨(dú)立的單元包(crate)中,并將它作為外部依賴(lài)進(jìn)行引用。

RUST提供了一系列的功能來(lái)幫助我們管理代碼,包括決定哪些細(xì)節(jié)是暴露的、哪些細(xì)節(jié)是私有的,以及不同的作用域的命名管理。這些功能有時(shí)被統(tǒng)稱(chēng)為模塊系統(tǒng)(module system),它們包括:

  • 包(package):一個(gè)用于構(gòu)建、測(cè)試并分享單元包的Cargo功能
  • 單元包(crate):一個(gè)用于生成庫(kù)或可執(zhí)行文件的樹(shù)形模塊結(jié)構(gòu)
  • 模塊(module)及use關(guān)鍵字:它們被用于控制文件結(jié)構(gòu)、作用域及路徑的私有性
  • 路徑(path):一種用于命名條目的方法,這些條目包括結(jié)構(gòu)體、函數(shù)和模塊等

有幾條規(guī)則決定了包可以包含哪些東西:首先,一個(gè)包中最多只能擁有一個(gè)庫(kù)單元包。其次,包可以擁有多個(gè)二進(jìn)制單元包。最后,包內(nèi)必須存在至少一個(gè)單元包(庫(kù)單元包或二進(jìn)制單元包)。

cargo new my-project

當(dāng)我們執(zhí)行這條命令時(shí),Cargo會(huì)生成一個(gè)包并創(chuàng)建相應(yīng)的Cargo.toml文件。Cargo會(huì)默認(rèn)將src/main.rs視作一個(gè)二進(jìn)制單元包的根節(jié)點(diǎn),這個(gè)二進(jìn)制單元包與包擁有相同的名字。同樣地,假設(shè)包的目錄中包含文件src/lib.rs,Cargo也會(huì)自動(dòng)將其視作與包同名的庫(kù)單元包的根節(jié)點(diǎn)。

最初生產(chǎn)的包只包含源文件src/main.rs,這也意味著只包含一個(gè)名為my-project的二進(jìn)制單元包。而假設(shè)包中同時(shí)存在src/main.rssrc/lib.rs,那么其中就會(huì)分別存在一個(gè)二進(jìn)制單元包和一個(gè)庫(kù)單元包,它們用于與包相同的名字。我們可以在路徑src/bin下添加源文件來(lái)創(chuàng)建出更多的二進(jìn)制單元包,這個(gè)路徑下的每個(gè)源文件都會(huì)被視作單獨(dú)的二進(jìn)制單元包。

我們依賴(lài)的外部包,比如提供生成隨機(jī)數(shù)功能的rand包就屬于單元包。將單元包的功能保留在它們自己的作用域中有助于指明某個(gè)特定功能來(lái)源于哪個(gè)單元包,并避免可能得命名沖突。

定義模塊來(lái)控制作用域及私有性

通過(guò)下面的方式創(chuàng)建一個(gè)庫(kù)單元包,RUST也默認(rèn)生成了單元測(cè)試的代碼

cargo new --lib restaurant
// src/lib.rs
mod front_of_house {
    mod host {
        fn add_to_waitlist() {}
        fn seat_at_table() {}
    }
    mod serving {
        fn take_order() {}
        fn serve_order() {}
        fn take_payment() {}
    }
}

通過(guò)mod關(guān)鍵字開(kāi)頭來(lái)定義一個(gè)模塊,接著指明這個(gè)模塊的名稱(chēng),并在其后使用一對(duì)花括號(hào)來(lái)包裹模塊體。模塊內(nèi)可以定義其他模塊,同樣也可以包含其它條目的定義,比如結(jié)構(gòu)體、枚舉、常量等。

我們前面提到過(guò),src/main.rssrc/lib.rs被稱(chēng)為單元包的根節(jié)點(diǎn),因?yàn)檫@兩個(gè)文件的內(nèi)容各自組成了一個(gè)名為crate的模塊,并位于單元包模塊結(jié)構(gòu)的根部。這個(gè)模塊結(jié)構(gòu)也被稱(chēng)為模塊樹(shù)(module tree),整個(gè)模塊樹(shù)都被放置在一個(gè)名為crate的隱式根模塊下:

crate
 └── front_of_house     
    ├── hosting     
    │   ├── add_to_waitlist     
    │   └── seat_at_table     
    └── serving     
        ├── take_order     
        ├── serve_order     
        └── take_payment

為了在RUST模塊樹(shù)中找到某個(gè)條目,我們需要指定條目的路徑,有兩種形式:

  • 使用單元包或字面量crate從根節(jié)點(diǎn)開(kāi)始的絕對(duì)路徑
  • 使用slefsuper或內(nèi)部標(biāo)識(shí)符從當(dāng)前模塊開(kāi)始的相對(duì)路徑

絕對(duì)路徑與相對(duì)路徑都至少由一個(gè)標(biāo)識(shí)符組成,標(biāo)識(shí)符之間使用雙冒號(hào)(::)分隔。

// src/lib.rs
pub fn eat_at_restaurant() {
    // 絕對(duì)路徑
    crate::front_of_house::host::add_to_waitlist();
    // 相對(duì)路徑
    front_of_house::host::add_to_waitlist();
}

我們使用絕對(duì)路徑和相對(duì)路徑來(lái)調(diào)用add_to_waitlist函數(shù),大部分開(kāi)發(fā)者更傾向使用絕對(duì)路徑,因?yàn)槲覀兺鶗?huì)彼此獨(dú)立地移動(dòng)代碼的定義與代碼調(diào)用。

這段代碼編譯器報(bào)錯(cuò),因?yàn)槟Khost是私有的。模塊不僅僅被用于組織代碼,同時(shí)還定義了RUST的私有邊界(privacy boundary):外部代碼無(wú)法訪(fǎng)問(wèn)那些由私有邊界封裝的細(xì)節(jié)。

RUST中的所有條目(函數(shù)、方法、結(jié)構(gòu)體、枚舉、模塊及常量)默認(rèn)都是私有的。處于父模塊中的條目無(wú)法使用子模塊中的私有條目,但子模塊中的條目可以使用祖先模塊中的條目。雖然子模塊包裝并隱藏了自身的實(shí)現(xiàn)細(xì)節(jié),但它卻依然能夠感知當(dāng)前定義環(huán)境的上下文。

我們需要給hosting模塊添加pub關(guān)鍵字,之后我們便擁有了訪(fǎng)問(wèn)hosting子模塊的權(quán)利。然后,我們?cè)俳oadd_to_waitlist添加pub關(guān)鍵字,私有性問(wèn)題就解決了。整個(gè)過(guò)程中,編譯正常通過(guò)而front_of_house模塊并沒(méi)有聲明為pub,是因?yàn)?code>front_of_house和eat_at_restaurant被定義在相同的模塊下。

fn server_oreder() {}
mod back_of_house {
    fn fix_incorrent_order() {
        cook_order();
        super::server_oreder();
    }
    fn cook_order() {}
}

代碼從父模塊開(kāi)始構(gòu)建相對(duì)路徑,這一方式需要在路徑起始處使用super關(guān)鍵字。這有些類(lèi)似于在文件系統(tǒng)中使用..語(yǔ)法開(kāi)始一段路徑。例子中,我們通過(guò)super關(guān)鍵字來(lái)跳轉(zhuǎn)至back_of_house的父模塊,也就是根模塊。

結(jié)構(gòu)體及枚舉聲明為公開(kāi)

當(dāng)我們?cè)诮Y(jié)構(gòu)體定義前使用pub時(shí),結(jié)構(gòu)體本身就成為了公共結(jié)構(gòu)體,但它的字段依舊保持了私有狀態(tài)。我們可以逐一決定是否將某個(gè)字段公開(kāi)。

枚舉與結(jié)構(gòu)體不同,由于枚舉只有在所有變體都公開(kāi)時(shí)才能實(shí)現(xiàn)最大的功效,而為所有枚舉變體添加pub則顯得繁瑣,因此所有的枚舉變體默認(rèn)都是公開(kāi)的。但前提是我們將枚舉聲明為公開(kāi)。

use將路徑導(dǎo)入作用域

基于路徑調(diào)用函數(shù)的寫(xiě)法使用起來(lái)有些重復(fù)和冗長(zhǎng),我們可以借助use關(guān)鍵字將路徑引入作用域,并像使用本地條目一樣來(lái)調(diào)用路徑中的條目。

mod front_of_house {
    pub mod host {
        pub fn add_to_waitlist() {}
    }
}
use crate::front_of_house::host;
pub fn eat_at_restaurant() {
    host::add_to_waitlist();
}

通過(guò)在單元包的根節(jié)點(diǎn)下添加use crate::front_of_house::host,host成為該作用域下的一個(gè)有效名字,就如同host模塊被定義在根節(jié)點(diǎn)下一樣。當(dāng)然,使用use將路徑引入作用域時(shí)也需要遵守私有性規(guī)則。

實(shí)例中使用了絕對(duì)路徑,使用相對(duì)路徑也是可以的:use front_of_house::host。

使用as提供新的名稱(chēng)

使用use將同名類(lèi)型引入作用域時(shí),可以在路徑后使用as關(guān)鍵字為類(lèi)型指定一個(gè)新的本地名字,也就是別名。

use std::fmt::Result;
use std::io::Result as IoResult;

使用嵌套的路徑來(lái)清理眾多use語(yǔ)句

use std::io;
use std::io::Write;

這兩條擁有共同的前綴std::io,該前綴還是第一條路徑本身。可以在嵌套路徑中使用self將兩條路徑合并至一行use語(yǔ)句中。

use std::io::{self, Write};

到此這篇關(guān)于rust 包模塊組織結(jié)構(gòu)的文章就介紹到這了,更多相關(guān)rust 包模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • rust文件讀寫(xiě)的實(shí)現(xiàn)示例

    rust文件讀寫(xiě)的實(shí)現(xiàn)示例

    Rust語(yǔ)言提供了強(qiáng)大的文件讀寫(xiě)庫(kù),使得開(kāi)發(fā)者可以更加方便地進(jìn)行文件操作,并且其安全性可以有效避免文件操作中可能出現(xiàn)的風(fēng)險(xiǎn),本文就來(lái)詳細(xì)的介紹了rust文件讀寫(xiě)的實(shí)現(xiàn)示例,感興趣的可以了解一下
    2023-12-12
  • 如何使用Rust的向量存儲(chǔ)值列表

    如何使用Rust的向量存儲(chǔ)值列表

    本文介紹了在Rust中使用向量存儲(chǔ)值列表的方法,包括創(chuàng)建、更新、讀取、遍歷、存儲(chǔ)多種類(lèi)型以及內(nèi)存釋放等方面,向量是Rust中常用且強(qiáng)大的集合類(lèi)型,熟練掌握其用法有助于編寫(xiě)高效且安全的代碼
    2025-02-02
  • 關(guān)于使用rust調(diào)用c++靜態(tài)庫(kù)并編譯nodejs包的問(wèn)題

    關(guān)于使用rust調(diào)用c++靜態(tài)庫(kù)并編譯nodejs包的問(wèn)題

    這篇文章主要介紹了使用rust調(diào)用c++靜態(tài)庫(kù)并編譯nodejs包的問(wèn)題,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • rust標(biāo)準(zhǔn)庫(kù)std::env環(huán)境相關(guān)的常量

    rust標(biāo)準(zhǔn)庫(kù)std::env環(huán)境相關(guān)的常量

    在本章節(jié)中, 我們探討了Rust處理命令行參數(shù)的常見(jiàn)的兩種方式和處理環(huán)境變量的兩種常見(jiàn)方式, 拋開(kāi)Rust的語(yǔ)法, 實(shí)際上在命令行參數(shù)的處理方式上, 與其它語(yǔ)言大同小異, 可能影響我們習(xí)慣的也就只剩下語(yǔ)法,本文介紹rust標(biāo)準(zhǔn)庫(kù)std::env的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2024-03-03
  • Rust 中判斷兩個(gè) HashMap 是否相等

    Rust 中判斷兩個(gè) HashMap 是否相等

    在Rust標(biāo)準(zhǔn)庫(kù)中,HashMap 實(shí)現(xiàn)了 PartialEq 和 Eq trait,但是這些trait的實(shí)現(xiàn)是基于嚴(yán)格的結(jié)構(gòu)相等性,包括元素的順序,這篇文章主要介紹了Rust 中判斷兩個(gè) HashMap 是否相等,需要的朋友可以參考下
    2024-04-04
  • Rust生命周期常見(jiàn)誤區(qū)(中英對(duì)照)全面指南

    Rust生命周期常見(jiàn)誤區(qū)(中英對(duì)照)全面指南

    這篇文章主要WEIDJAI?介紹了Rust生命周期常見(jiàn)誤區(qū)(中英對(duì)照)的全面指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • 在Rust中要用Struct和Enum組織數(shù)據(jù)的原因解析

    在Rust中要用Struct和Enum組織數(shù)據(jù)的原因解析

    在Rust中,Struct和Enum是組織數(shù)據(jù)的核心工具,Struct用于將相關(guān)字段封裝為單一實(shí)體,便于管理和擴(kuò)展,Enum用于明確定義所有可能的狀態(tài),本文將通過(guò)具體示例,深入探討為什么在Rust中必須使用struct和enum來(lái)管理數(shù)據(jù),感興趣的朋友一起學(xué)習(xí)吧
    2025-02-02
  • vscode搭建rust開(kāi)發(fā)環(huán)境的圖文教程

    vscode搭建rust開(kāi)發(fā)環(huán)境的圖文教程

    Rust 是一種系統(tǒng)編程語(yǔ)言,它專(zhuān)注于內(nèi)存安全、并發(fā)和性能,本文主要介紹了vscode搭建rust開(kāi)發(fā)環(huán)境的圖文教程,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Rust中類(lèi)型轉(zhuǎn)換在錯(cuò)誤處理中的應(yīng)用小結(jié)

    Rust中類(lèi)型轉(zhuǎn)換在錯(cuò)誤處理中的應(yīng)用小結(jié)

    隨著項(xiàng)目的進(jìn)展,關(guān)于Rust的故事又翻開(kāi)了新的一頁(yè),今天來(lái)到了服務(wù)器端的開(kāi)發(fā)場(chǎng)景,發(fā)現(xiàn)錯(cuò)誤處理中的錯(cuò)誤類(lèi)型轉(zhuǎn)換有必要分享一下,對(duì)Rust錯(cuò)誤處理相關(guān)知識(shí)感興趣的朋友一起看看吧
    2023-09-09
  • Rust自定義安裝路徑的詳細(xì)圖文教程

    Rust自定義安裝路徑的詳細(xì)圖文教程

    工欲善其事必先利其器,無(wú)論是對(duì)小白還是大神來(lái)說(shuō),想要學(xué)習(xí) Rust 第一步那必須是 Rust 的環(huán)境配置,下面這篇文章主要給大家介紹了關(guān)于Rust自定義安裝路徑的詳細(xì)圖文教程,需要的朋友可以參考下
    2023-03-03

最新評(píng)論

普陀区| 黎城县| 茌平县| 肥西县| 乌兰察布市| 崇礼县| 新疆| 土默特左旗| 凭祥市| 洞口县| 墨脱县| 新建县| 绥棱县| 尉犁县| 舞钢市| 徐汇区| 广宁县| 南京市| 益阳市| 积石山| 南昌市| 炉霍县| 平遥县| 白玉县| 柞水县| 安岳县| 友谊县| 龙门县| 叙永县| 望都县| 稷山县| 黑河市| 冕宁县| 芦山县| 鄂托克前旗| 咸阳市| 安远县| 临潭县| 大安市| 精河县| 东至县|