亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

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

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

cargo new my-project

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

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

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

定義模塊來控制作用域及私有性

通過下面的方式創(chuàng)建一個庫單元包,RUST也默認生成了單元測試的代碼

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() {}
    }
}

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

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

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

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

  • 使用單元包或字面量crate從根節(jié)點開始的絕對路徑
  • 使用slef、super或內(nèi)部標識符從當前模塊開始的相對路徑

絕對路徑與相對路徑都至少由一個標識符組成,標識符之間使用雙冒號(::)分隔。

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

我們使用絕對路徑和相對路徑來調(diào)用add_to_waitlist函數(shù),大部分開發(fā)者更傾向使用絕對路徑,因為我們往往會彼此獨立地移動代碼的定義與代碼調(diào)用。

這段代碼編譯器報錯,因為模塊host是私有的。模塊不僅僅被用于組織代碼,同時還定義了RUST的私有邊界(privacy boundary):外部代碼無法訪問那些由私有邊界封裝的細節(jié)。

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

我們需要給hosting模塊添加pub關鍵字,之后我們便擁有了訪問hosting子模塊的權(quán)利。然后,我們再給add_to_waitlist添加pub關鍵字,私有性問題就解決了。整個過程中,編譯正常通過而front_of_house模塊并沒有聲明為pub,是因為front_of_houseeat_at_restaurant被定義在相同的模塊下。

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

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

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

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

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

use將路徑導入作用域

基于路徑調(diào)用函數(shù)的寫法使用起來有些重復和冗長,我們可以借助use關鍵字將路徑引入作用域,并像使用本地條目一樣來調(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();
}

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

實例中使用了絕對路徑,使用相對路徑也是可以的:use front_of_house::host。

使用as提供新的名稱

使用use將同名類型引入作用域時,可以在路徑后使用as關鍵字為類型指定一個新的本地名字,也就是別名。

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

使用嵌套的路徑來清理眾多use語句

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

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

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

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

相關文章

  • rust中間件actix_web在項目中的使用實戰(zhàn)

    rust中間件actix_web在項目中的使用實戰(zhàn)

    這篇文章主要介紹了rust中間件在項目中的使用實戰(zhàn),包括自定義中間件,日志中間件,Default?headers,用戶會話,錯誤處理的用法實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • 深入了解Rust?結(jié)構(gòu)體的使用

    深入了解Rust?結(jié)構(gòu)體的使用

    結(jié)構(gòu)體是一種自定義的數(shù)據(jù)類型,它允許我們將多個不同的類型組合成一個整體。下面我們就來學習如何定義和使用結(jié)構(gòu)體,并對比元組與結(jié)構(gòu)體之間的異同,需要的可以參考一下
    2022-11-11
  • Rust動態(tài)調(diào)用字符串定義的Rhai函數(shù)方式

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

    Rust中使用Rhai動態(tài)調(diào)用字符串定義的函數(shù),通過eval_expression_with_scope實現(xiàn),但參數(shù)傳遞和函數(shù)名處理有局限性,使用FnCall功能更健壯,但更復雜,總結(jié)提供了更通用的方法,但需要處理更多錯誤情況
    2025-02-02
  • Rust動態(tài)數(shù)組Vec基本概念及用法

    Rust動態(tài)數(shù)組Vec基本概念及用法

    Rust中的Vec是一種動態(tài)數(shù)組,它可以在運行時自動調(diào)整大小,本文主要介紹了Rust動態(tài)數(shù)組Vec基本概念及用法,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • Rust語言中的哈希表

    Rust語言中的哈希表

    哈希表也是集合中的一種,也是最常用的集合形式,目前Rust語言核心部分沒有對哈希表進行實現(xiàn),是使用標準庫提供的,這篇文章主要介紹了Rust語言之哈希表,需要的朋友可以參考下
    2024-02-02
  • Rust 中的 Packages 與 Crates模塊化構(gòu)建的基礎及開發(fā)流程

    Rust 中的 Packages 與 Crates模塊化構(gòu)建的基礎及開發(fā)流程

    Rust中的Crate是編譯器處理的最小代碼單元,可以是二進制或庫,每個Crate由一個CrateRoot文件(通常是src/main.rs或src/lib.rs)定義,本文給大家介紹Rust 中的 Packages 與 Crates模塊化構(gòu)建的基礎及開發(fā)流程,感興趣的朋友一起看看吧
    2025-02-02
  • Rust 枚舉和模式匹配的實現(xiàn)

    Rust 枚舉和模式匹配的實現(xiàn)

    枚舉是 Rust 中非常重要的復合類型,也是最強大的復合類型之一,廣泛用于屬性配置、錯誤處理、分支流程、類型聚合等場景中,本文就來介紹一下Rust 枚舉和模式匹配,感興趣的可以了解一下
    2023-12-12
  • 一步到位,教你如何在Windows成功安裝Rust

    一步到位,教你如何在Windows成功安裝Rust

    一步到位:輕松學會在Windows上安裝Rust!想快速掌握Rust編程語言?別再為復雜教程頭疼!這份指南將手把手帶你順利完成Windows平臺上的Rust安裝全過程,從此編碼之旅更加順暢無阻,立即閱讀,開始你的Rust編程旅程吧!
    2024-01-01
  • Rust包和Crate超詳細講解

    Rust包和Crate超詳細講解

    這篇文章主要介紹了Rust包管理和Crate,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-12-12
  • 一文詳解Rust中的錯誤處理

    一文詳解Rust中的錯誤處理

    這篇文章主要為大家詳細介紹了Rust中的錯誤處理的相關知識,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-01-01

最新評論