rust
最近開始學(xué)習(xí)rust語(yǔ)言。感覺這門語(yǔ)言相對(duì)java確實(shí)是難上很多。開幾個(gè)文章把遇到的問(wèn)題記錄一下
rust關(guān)于包,Crate
關(guān)于包,Crate這塊先看看官方書籍怎么說(shuō)的
crate 是 Rust 在編譯時(shí)最小的代碼單位。如果你用 rustc 而不是 cargo 來(lái)編譯一個(gè)文件(第一章我們這么做過(guò)),編譯器還是會(huì)將那個(gè)文件認(rèn)作一個(gè) crate。crate 可以包含模塊,模塊可以定義在其他文件,然后和 crate 一起編譯,我們會(huì)在接下來(lái)的章節(jié)中遇到。
crate 有兩種形式:二進(jìn)制項(xiàng)和庫(kù)。二進(jìn)制項(xiàng) 可以被編譯為可執(zhí)行程序,比如一個(gè)命令行程序或者一個(gè)服務(wù)器。它們必須有一個(gè) main 函數(shù)來(lái)定義當(dāng)程序被執(zhí)行的時(shí)候所需要做的事情。目前我們所創(chuàng)建的 crate 都是二進(jìn)制項(xiàng)。
庫(kù) 并沒(méi)有 main 函數(shù),它們也不會(huì)編譯為可執(zhí)行程序,它們提供一些諸如函數(shù)之類的東西,使其他項(xiàng)目也能使用這些東西。比如 第二章 的 rand crate 就提供了生成隨機(jī)數(shù)的東西。大多數(shù)時(shí)間 Rustaceans 說(shuō)的 crate 指的都是庫(kù),這與其他編程語(yǔ)言中 library 概念一致。
crate root 是一個(gè)源文件,Rust 編譯器以它為起始點(diǎn),并構(gòu)成你的 crate 的根模塊(我們將在 “定義模塊來(lái)控制作用域與私有性” 一節(jié)深入解讀)。
包(package)是提供一系列功能的一個(gè)或者多個(gè) crate。一個(gè)包會(huì)包含一個(gè) Cargo.toml 文件,闡述如何去構(gòu)建這些 crate。Cargo 就是一個(gè)包含構(gòu)建你代碼的二進(jìn)制項(xiàng)的包。Cargo 也包含這些二進(jìn)制項(xiàng)所依賴的庫(kù)。其他項(xiàng)目也能用 Cargo 庫(kù)來(lái)實(shí)現(xiàn)與 Cargo 命令行程序一樣的邏輯。包中可以包含至多一個(gè)庫(kù) crate(library crate)。包中可以包含任意多個(gè)二進(jìn)制 crate(binary crate),但是必須至少包含一個(gè) crate(無(wú)論是庫(kù)的還是二進(jìn)制的)
這里我個(gè)人理解包類似于java當(dāng)中maven當(dāng)中的模塊,crate root 是一個(gè)源文件,Rust 編譯器以它為起始點(diǎn),并構(gòu)成你的 crate 的根模塊。就是說(shuō)各個(gè)mod串聯(lián)的起點(diǎn),比如main.rs當(dāng)中定義。或者lib.rs庫(kù)create
mod
先看看官方教程
這里我們提供一個(gè)簡(jiǎn)單的參考,用來(lái)解釋模塊、路徑、use關(guān)鍵詞和pub關(guān)鍵詞如何在編譯器中工作,以及大部分開發(fā)者如何組織他們的代碼。我們將在本章節(jié)中舉例說(shuō)明每條規(guī)則,不過(guò)這是一個(gè)解釋模塊工作方式的良好參考。
從 crate 根節(jié)點(diǎn)開始: 當(dāng)編譯一個(gè) crate, 編譯器首先在 crate 根文件(通常,對(duì)于一個(gè)庫(kù) crate 而言是src/lib.rs,對(duì)于一個(gè)二進(jìn)制 crate 而言是src/main.rs)中尋找需要被編譯的代碼。
聲明模塊: 在 crate 根文件中,你可以聲明一個(gè)新模塊;比如,你用mod garden聲明了一個(gè)叫做garden的模塊。編譯器會(huì)在下列路徑中尋找模塊代碼:
內(nèi)聯(lián),在大括號(hào)中,當(dāng)mod garden后方不是一個(gè)分號(hào)而是一個(gè)大括號(hào) ,在文件 src/garden.rs,在文件 src/garden/mod.rs
聲明子模塊: 在除了 crate 根節(jié)點(diǎn)以外的其他文件中,你可以定義子模塊。比如,你可能在src/garden.rs中定義了mod vegetables;。編譯器會(huì)在以父模塊命名的目錄中尋找子模塊代碼:內(nèi)聯(lián),在大括號(hào)中,當(dāng)mod vegetables后方不是一個(gè)分號(hào)而是一個(gè)大括號(hào)
在文件 src/garden/vegetables.rs
在文件 src/garden/vegetables/mod.rs
模塊中的代碼路徑: 一旦一個(gè)模塊是你 crate 的一部分,你可以在隱私規(guī)則允許的前提下,從同一個(gè) crate 內(nèi)的任意地方,通過(guò)代碼路徑引用該模塊的代碼。舉例而言,一個(gè) garden vegetables 模塊下的Asparagus類型可以在crate::garden::vegetables::Asparagus被找到。
私有 vs 公用: 一個(gè)模塊里的代碼默認(rèn)對(duì)其父模塊私有。為了使一個(gè)模塊公用,應(yīng)當(dāng)在聲明時(shí)使用pub mod替代mod。為了使一個(gè)公用模塊內(nèi)部的成員公用,應(yīng)當(dāng)在聲明前使用pub。
use 關(guān)鍵字: 在一個(gè)作用域內(nèi),use關(guān)鍵字創(chuàng)建了一個(gè)成員的快捷方式,用來(lái)減少長(zhǎng)路徑的重復(fù)。在任何可以引用crate::garden::vegetables::Asparagus的作用域,你可以通過(guò) use crate::garden::vegetables::Asparagus;創(chuàng)建一個(gè)快捷方式,然后你就可以在作用域中只寫Asparagus來(lái)使用該類型。
這里我個(gè)人理解就像是java當(dāng)中的package,當(dāng)然也有很大區(qū)別。通過(guò)這些能組織項(xiàng)目中的目錄,各個(gè)package引用
舉個(gè)例子,用mvc層架構(gòu)controller包舉例
想創(chuàng)建controller目錄,首先再main.rs或者lib.rs當(dāng)中聲明mod,這里用main.rs舉例
pub mod controller;
fn main() {
println!("hello world!");
}
然后就可以創(chuàng)建controller目錄了,并創(chuàng)建對(duì)應(yīng)的mod.js
下面再controller目錄下創(chuàng)建別的rs文件可以這么做,比如創(chuàng)建user模塊的。
在controller/mod.rs當(dāng)中聲明user mod文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-638306.html
pub mod user;
然后就可以在controller目錄下創(chuàng)建user.rs mod了
最終下來(lái)簡(jiǎn)單結(jié)構(gòu)如圖
后續(xù)可以按照此方法創(chuàng)建單package下的代碼結(jié)構(gòu)了。
文章算是記錄遇到的問(wèn)題。如有不對(duì)的地方歡迎指正文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-638306.html
到了這里,關(guān)于rust關(guān)于項(xiàng)目結(jié)構(gòu)包,Crate和mod和目錄的組織的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!