偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Rust中的包(packages)、模塊(modules)和箱(crates)的愛(ài)恨情仇

開(kāi)發(fā) 前端
在 Rust 中,一個(gè)重要的概念是 crate 根(crate root)。crate 根是編譯器構(gòu)建程序的起點(diǎn)。在上面的例子中,無(wú)論我們將文件命名為 something.rs 還是其他名字,這個(gè)文件都會(huì)被視為 crate 根。

今天,我想和大家分享我對(duì) Rust 中的包(packages)、模塊(modules)和箱(crates)的理解。Rust 的組織系統(tǒng)一開(kāi)始讓我覺(jué)得很難掌握,但經(jīng)過(guò)一段時(shí)間的學(xué)習(xí)和實(shí)踐,我終于逐漸理清了它們的關(guān)系。

讓我們從基礎(chǔ)開(kāi)始,逐步深入!

箱(Crates)

箱(crate)是 Rust 程序的最小單元。例如,下面這段代碼就是一個(gè)簡(jiǎn)單的 crate:

fn main() {
    println!("I am a crate.");
}

在 Rust 中,一個(gè)重要的概念是 crate 根(crate root)。crate 根是編譯器構(gòu)建程序的起點(diǎn)。在上面的例子中,無(wú)論我們將文件命名為 something.rs 還是其他名字,這個(gè)文件都會(huì)被視為 crate 根。

Rust 中有兩種類(lèi)型的 crate:二進(jìn)制 crate 和 庫(kù) crate。

  • 二進(jìn)制 crate 是獨(dú)立的可執(zhí)行文件,包含一個(gè) main 函數(shù),可以直接運(yùn)行。
  • 庫(kù) crate 是一組功能的集合,供其他 crate 使用。它沒(méi)有 main 函數(shù),無(wú)法獨(dú)立運(yùn)行。

在組織 Rust 程序時(shí),一個(gè)常見(jiàn)的方式是將程序拆分為一個(gè)二進(jìn)制 crate 和一個(gè)庫(kù) crate。二進(jìn)制 crate(通常命名為 main.rs)包含可執(zhí)行文件,而庫(kù) crate 則存儲(chǔ)可復(fù)用的功能。二進(jìn)制 crate 可以通過(guò)導(dǎo)入庫(kù) crate 的類(lèi)型、方法等來(lái)使用它的功能。

包(Packages)

包(package)是一個(gè)或多個(gè) crate 的集合,它們協(xié)同工作以提供某種功能。每個(gè)包都包含一個(gè) Cargo.toml 文件,用于告訴 Rust 編譯器如何構(gòu)建其中的 crate。

  • 一個(gè)包可以包含多個(gè)二進(jìn)制 crate,但只能包含一個(gè)庫(kù) crate。
  • 至少,一個(gè)包必須包含一個(gè) crate(無(wú)論是二進(jìn)制還是庫(kù))。

項(xiàng)目根目錄下的 Cargo.toml 文件定義了一個(gè)包的存在。默認(rèn)情況下,Cargo 會(huì)假定 src/main.rs 是二進(jìn)制 crate 的根,而 src/lib.rs 是庫(kù) crate 的根。包的名稱默認(rèn)與二進(jìn)制或庫(kù) crate 的名稱一致,但可以在 Cargo.toml 中自定義。例如:

[[bin]]
name = "fun-with-nom"
path = "src/bin/httpd.rs"

[lib]
name = "fun_with_nom_lib"
path = "src/lib/lib.rs"

在組織 Rust 項(xiàng)目時(shí),我發(fā)現(xiàn)將初始化和啟動(dòng)邏輯放在一個(gè)二進(jìn)制 crate 中,而將核心功能放在一個(gè)庫(kù) crate 中非常有用。對(duì)于小型項(xiàng)目,這種結(jié)構(gòu)可能顯得繁瑣,但對(duì)于大型代碼庫(kù)(例如 API),這種模塊化的結(jié)構(gòu)可以顯著提高代碼的可維護(hù)性。遵循這種結(jié)構(gòu)讓我在回顧舊項(xiàng)目時(shí)省了不少麻煩。

模塊(Modules)

crate 可以進(jìn)一步劃分為模塊(module),模塊可以存在于單個(gè)文件中,也可以分布在多個(gè)文件中。模塊的主要作用有兩個(gè):

  • 組織代碼:將相關(guān)代碼分組為易于管理的單元。
  • 控制可見(jiàn)性:模塊中的代碼默認(rèn)是私有的,除非顯式聲明為公共(public)。

雖然可以將所有模塊定義在一個(gè)文件中,但這種方式很快會(huì)變得難以管理。因此,將模塊組織到單獨(dú)的文件中是一種更好的做法,便于導(dǎo)航和維護(hù)。

路徑(Paths)

Rust 編譯器使用路徑(path)來(lái)定位代碼。路徑類(lèi)似于 Windows、Linux 或 macOS 中的文件系統(tǒng)路徑,分為兩種形式:

  • 絕對(duì)路徑:從 crate 根開(kāi)始。對(duì)于外部 crate,路徑以 crate 名稱開(kāi)頭;對(duì)于當(dāng)前 crate 的代碼,路徑以 crate 關(guān)鍵字開(kāi)頭。
  • 相對(duì)路徑:從當(dāng)前模塊開(kāi)始,使用 self、super 或當(dāng)前模塊中的標(biāo)識(shí)符。例如,super 表示父模塊。

use 關(guān)鍵字

use 關(guān)鍵字可以將模塊引入作用域,使其內(nèi)容可以在程序的其他部分訪問(wèn)。這在避免重復(fù)書(shū)寫(xiě)路徑時(shí)尤其有用。例如:

use serde::Deserialize;

如果我們?cè)?nbsp;Cargo.toml 的依賴項(xiàng)中添加了 serde crate(包括 derive 功能標(biāo)志),這行代碼會(huì)將 Deserialize 宏引入作用域,以便我們可以在自定義類(lèi)型中使用它。

命名空間操作符(Namespace Operator)

Rust 的命名空間操作符 :: 通常與 use 關(guān)鍵字一起使用,用于訪問(wèn)模塊中的項(xiàng)。例如:

use axum::{http::StatusCode, routing::get, response::IntoResponse};

在這里,我們引入了 axum Web 應(yīng)用框架,并同時(shí)引入了以下具體依賴:

  • http 模塊中的 StatusCode 類(lèi)型
  • routing 模塊中的 get 方法
  • response 模塊中的 IntoResponse 特性(trait)

當(dāng)我們只需要模塊中的某些內(nèi)容時(shí),可以將它們用 {} 包裹起來(lái)。

總結(jié)

一開(kāi)始,我對(duì)如何有效使用 Rust 中的 crate、package 和 module 感到困惑。但隨著實(shí)踐的積累,這些概念逐漸變得清晰并融會(huì)貫通。我希望這篇文章能幫助那些面臨類(lèi)似挑戰(zhàn)的讀者。

責(zé)任編輯:武曉燕 來(lái)源: Rust開(kāi)發(fā)筆記
相關(guān)推薦

2022-09-02 12:13:22

TCPUDP場(chǎng)景

2025-01-03 09:39:04

2019-05-15 15:10:12

Tomcat Session Cookie

2022-05-13 09:47:28

Docker容器

2021-04-12 06:08:16

HiveSpark大數(shù)據(jù)

2020-11-24 10:13:20

測(cè)試開(kāi)發(fā)管理

2024-08-07 08:22:27

2024-06-05 11:06:22

Go語(yǔ)言工具

2024-06-07 00:09:50

2022-05-07 07:43:07

Redis存儲(chǔ)系統(tǒng)數(shù)據(jù)庫(kù)

2020-04-09 15:26:55

間諜軟件NSOFacebook

2013-02-20 10:00:16

微軟CodePlexGitHub

2021-06-16 06:48:06

接口微信

2024-03-11 09:37:01

模型圖片編輯

2020-06-16 15:48:40

蘋(píng)果英特爾芯片

2015-11-24 15:13:15

2015-11-05 09:55:40

SDNNFV

2020-05-27 14:07:21

蜂窩廣域網(wǎng)局域物聯(lián)網(wǎng)物聯(lián)網(wǎng)

2017-01-10 09:59:51

2021-05-10 23:28:29

vRANC-RANO-RAN
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)