Rust 從入門(mén)到精通03-helloworld
1、rustc 方式
1.1 創(chuàng)建項(xiàng)目目錄
rust 運(yùn)行不關(guān)心代碼存放的目錄,我們可以任意選擇一個(gè)合適的位置,創(chuàng)建一個(gè)目錄。
比如:我們創(chuàng)建一個(gè)目錄名稱(chēng)為 rust_helloword
mkdir rust_helloword
1.2 編寫(xiě)rust程序
rust 的源文件后綴是 .rs 。所以我們?cè)诘谝粋€(gè)創(chuàng)建的項(xiàng)目目錄下,創(chuàng)建一個(gè) main.rs 文件。
然后在 main.rs 文件中寫(xiě)入如下代碼:
?fn main(){
? ? ?println!("Hello World!");
?}
1.3 編譯并運(yùn)行 rust 程序
在創(chuàng)建的 main.rs 文件目錄下,輸入如下命令:
①、編譯
rustc main.rs
執(zhí)行之后,會(huì)在當(dāng)前目錄下生成一個(gè) main 的可執(zhí)行文件。
PS:windows 是生成 main.exe 可執(zhí)行文件;Linux/Mac 是生成 main 文件。
②、運(yùn)行
./main
運(yùn)行之后會(huì)在窗口打印出 Hello World!

至此,我們完成了第一個(gè) Rust 程序的編寫(xiě)。
2、cargo方式
cargo 英文文檔:https://doc.rust-lang.org/cargo/
cargo中文文檔:https://cargo.budshome.com/index.html
Cargo 是 Rust 的構(gòu)建系統(tǒng)和包管理器。大多數(shù) Rustacean(這個(gè)詞是從甲殼綱動(dòng)物這個(gè)單詞Crustacean[[kr?'ste??n]],去掉了首字母C,而演變而來(lái)的,表示 rust 開(kāi)發(fā)者) 使用 Cargo 來(lái)管理 Rust 項(xiàng)目,因?yàn)樗梢詾槟闾幚砗芏嗳蝿?wù),比如構(gòu)建代碼、下載依賴庫(kù)并編譯這些庫(kù)。
在編寫(xiě)更加復(fù)雜的 rust 程序時(shí),會(huì)用到很多依賴項(xiàng),如果使用 Cargo 來(lái)啟動(dòng)項(xiàng)目,會(huì)簡(jiǎn)單很多。
2.1 檢查cargo安裝
注意:在安裝 rust 時(shí),我們是安裝的 rustup,這會(huì)自動(dòng)安裝 Cargo,所以我們這里不介紹如何安裝 cargo。
cargo --version
出現(xiàn)如下界面:

分別是 cargo 【版本號(hào)】(【哈希碼】 【發(fā)布時(shí)間】)
2.2 創(chuàng)建項(xiàng)目
輸入如下命令:
cargo new hello_cargo

該命令會(huì)自動(dòng)創(chuàng)建一個(gè) hello_cargo 目錄,里面包含兩個(gè)文件和一個(gè)目錄:一個(gè) Cargo.toml 文件,一個(gè) src 目錄,以及位于 src 目錄中的 main.rs 文件。
2.3 文件介紹
①、Cargo.toml
?[package]
?name = "hello_cargo"
?version = "0.1.0"
?authors = ["Your Name <you@example.com>"]
?edition = "2018"
?
?[dependencies]
這是 Cargo的配置文件,使用 TOML (Tom's Obvious, Minimal Language)語(yǔ)法
第一行,[package]
,是一個(gè)片段(section)標(biāo)題,表明下面的語(yǔ)句用來(lái)配置一個(gè)包。隨著我們?cè)谶@個(gè)文件增加更多的信息,還將增加其他片段(section)。
接下來(lái)的四行設(shè)置了 Cargo 編譯程序所需的配置:項(xiàng)目的名稱(chēng)、版本、作者以及要使用的 Rust 版本。Cargo 從環(huán)境中獲取你的名字和 email 信息,所以如果這些信息不正確,請(qǐng)修改并保存此文件。
最后一行,[dependencies]
,用于書(shū)寫(xiě)項(xiàng)目的依賴包(類(lèi)似Maven、Gradle里面編寫(xiě)的依賴)。在 Rust 中,代碼包被稱(chēng)為 crates。這個(gè)項(xiàng)目并不需要其他的 crate。
②、src/main.rs
?fn main() {
? ? ?println!("Hello, world!");
?}
Cargo 為我們生成了一個(gè) “Hello, world!” 程序,rust 原生方式與 Cargo 生成項(xiàng)目的區(qū)別是 Cargo 將代碼放在 src 目錄,同時(shí)項(xiàng)目根目錄包含一個(gè) Cargo.toml 配置文件。
Cargo 期望源文件存放在 src 目錄中。項(xiàng)目根目錄只存放 README、license 信息、配置文件和其他跟代碼無(wú)關(guān)的文件。使用 Cargo 幫助你保持項(xiàng)目干凈整潔,一切井井有條。
如果沒(méi)有使用 Cargo 開(kāi)始項(xiàng)目,比如我們創(chuàng)建的 Hello,world! 項(xiàng)目,可以將其轉(zhuǎn)化為一個(gè) Cargo 項(xiàng)目:將代碼放入 src 目錄,并創(chuàng)建一個(gè)合適的 Cargo.toml 文件。
2.4 構(gòu)建并運(yùn)行項(xiàng)目
①、構(gòu)建項(xiàng)目
cargo bulid

這個(gè)命令會(huì)創(chuàng)建一個(gè)可執(zhí)行文件 target/debug/hello_cargo (在 Windows 上是 target\debug\hello_cargo.exe),而不是放在當(dāng)前目錄下。
②、運(yùn)行
執(zhí)行運(yùn)行上一步生成的可執(zhí)行文件即可。

如果一切順利,終端上應(yīng)該會(huì)打印出 Hello, world!
。首次運(yùn)行 cargo build
時(shí),也會(huì)使 Cargo 在項(xiàng)目根目錄創(chuàng)建一個(gè)新文件:Cargo.lock。這個(gè)文件記錄項(xiàng)目依賴的實(shí)際版本。這個(gè)項(xiàng)目并沒(méi)有依賴,所以其內(nèi)容比較少。
原則上自己永遠(yuǎn)也不需要碰這個(gè)文件,讓 Cargo 處理它就行了。
2.5 cargo run
我們剛剛使用 cargo build
構(gòu)建了項(xiàng)目,并使用 ./target/debug/hello_cargo
運(yùn)行了程序,也可以使用 cargo run
在一個(gè)命令中同時(shí)編譯并運(yùn)行生成的可執(zhí)行文件:

注意這一次并沒(méi)有出現(xiàn)表明 Cargo 正在編譯 hello_cargo
的輸出。Cargo 發(fā)現(xiàn)文件并沒(méi)有被改變,就直接運(yùn)行了二進(jìn)制文件。如果修改了源文件的話,Cargo 會(huì)在運(yùn)行之前重新構(gòu)建項(xiàng)目,并會(huì)出現(xiàn)像這樣的輸出:

2.6 cargo check
cargo check 該命令可以快速檢查代碼確保其可以進(jìn)行編譯,但是不產(chǎn)生可執(zhí)行文件。

為什么你會(huì)不需要可執(zhí)行文件呢?
通常 cargo check
要比 cargo build
快得多,因?yàn)樗÷粤松煽蓤?zhí)行文件的步驟。如果你在編寫(xiě)代碼時(shí)持續(xù)的進(jìn)行檢查,cargo check
會(huì)加速開(kāi)發(fā)!為此很多 Rustaceans 編寫(xiě)代碼時(shí)定期運(yùn)行 cargo check
確保它們可以編譯。當(dāng)準(zhǔn)備好使用可執(zhí)行文件時(shí)才運(yùn)行 cargo build
。
2.7 發(fā)布(release)構(gòu)建
當(dāng)項(xiàng)目最終準(zhǔn)備好發(fā)布時(shí),可以使用 cargo build --release
來(lái)優(yōu)化編譯項(xiàng)目。這會(huì)在 target/release 而不是 target/debug 下生成可執(zhí)行文件。這些優(yōu)化可以讓 Rust 代碼運(yùn)行的更快,不過(guò)啟用這些優(yōu)化也需要消耗更長(zhǎng)的編譯時(shí)間。這也就是為什么會(huì)有兩種不同的配置:一種是為了開(kāi)發(fā),你需要經(jīng)??焖僦匦聵?gòu)建;
另一種是為用戶構(gòu)建最終程序,它們不會(huì)經(jīng)常重新構(gòu)建,并且希望程序運(yùn)行得越快越好。
如果你在測(cè)試代碼的運(yùn)行時(shí)間,請(qǐng)確保運(yùn)行 cargo build --release
并使用 target/release 下的可執(zhí)行文件進(jìn)行測(cè)試。
3、總結(jié)
對(duì)于簡(jiǎn)單項(xiàng)目, Cargo 并不比 rustc
提供了更多的優(yōu)勢(shì),不過(guò)隨著開(kāi)發(fā)的深入,其優(yōu)勢(shì)會(huì)越來(lái)越大。對(duì)于擁有多個(gè) crate 的復(fù)雜項(xiàng)目,交給 Cargo 來(lái)協(xié)調(diào)構(gòu)建將簡(jiǎn)單的多。