為什么要選Rust?學(xué)習(xí)Rust從零開(kāi)始配置和實(shí)現(xiàn)第一個(gè)簡(jiǎn)單項(xiàng)目
一、為什么要學(xué)習(xí)Rust?——理解Rust的核心價(jià)值與應(yīng)用場(chǎng)景
1.1 新手最關(guān)心的三個(gè)問(wèn)題
作為Rust聯(lián)合創(chuàng)作人,我接觸過(guò)大量剛?cè)腴T或想轉(zhuǎn)Rust的開(kāi)發(fā)者,他們問(wèn)得最多的三個(gè)問(wèn)題是:
- Rust難學(xué)嗎?
?? 客觀講,Rust有一定學(xué)習(xí)門檻(主要是內(nèi)存安全機(jī)制和所有權(quán)系統(tǒng)),但只要遵循循序漸進(jìn)的學(xué)習(xí)路徑,有其他語(yǔ)言基礎(chǔ)(哪怕是Python這種非系統(tǒng)語(yǔ)言),通常1-2個(gè)月就能上手開(kāi)發(fā)簡(jiǎn)單項(xiàng)目,3-6個(gè)月能熟練寫(xiě)生產(chǎn)級(jí)代碼。 - Rust適合做什么?
? 系統(tǒng)級(jí)開(kāi)發(fā):操作系統(tǒng)內(nèi)核(如Redox)、驅(qū)動(dòng)程序、嵌入式系統(tǒng)(ESP32/STM32等支持Rust)
? 網(wǎng)絡(luò)編程:高性能服務(wù)器(如Tokio框架的異步服務(wù)器)、區(qū)塊鏈(如Solana)
? 工具開(kāi)發(fā):Docker Desktop、GitLab CI Runner、GitHub Copilot的后端引擎
? WebAssembly:前端性能瓶頸優(yōu)化(如Yew/Tauri框架開(kāi)發(fā)桌面Web混合應(yīng)用) - Rust比C/C++好在哪?
?? 內(nèi)存安全:通過(guò)所有權(quán)、借用、生命周期三大核心機(jī)制,在編譯期就杜絕了空指針、野指針、內(nèi)存泄漏等C/C++常見(jiàn)的安全問(wèn)題,無(wú)需GC(垃圾回收)
?? 高性能:與C/C++旗鼓相當(dāng),無(wú)運(yùn)行時(shí)開(kāi)銷
?? 生態(tài)系統(tǒng):Cargo包管理工具非常強(qiáng)大,crates.io(Rust的PyPI)有超過(guò)150萬(wàn)個(gè)開(kāi)源庫(kù)
?? 語(yǔ)法現(xiàn)代化:支持模式匹配、泛型、異步編程、迭代器等現(xiàn)代語(yǔ)言特性
1.2 真實(shí)案例:Rust在生產(chǎn)環(huán)境中的應(yīng)用
?? 案例1:Microsoft Azure用Rust重構(gòu)Sway防火墻
Microsoft Azure的Sway防火墻原來(lái)用C++開(kāi)發(fā),存在大量安全漏洞和內(nèi)存泄漏問(wèn)題。2021年,Azure團(tuán)隊(duì)用Rust重構(gòu)了核心模塊,安全漏洞減少了90%,性能提升了20%。
?? 案例2:Cloudflare用Rust開(kāi)發(fā)Wrangler CLI工具
Cloudflare Workers的官方CLI工具Wrangler,原來(lái)用Node.js開(kāi)發(fā),下載依賴慢、啟動(dòng)時(shí)間長(zhǎng)。2022年,Cloudflare團(tuán)隊(duì)用Rust重構(gòu)了Wrangler,啟動(dòng)時(shí)間從30秒縮短到1秒,下載依賴速度提升了5倍。

二、Rust開(kāi)發(fā)環(huán)境搭建全流程——Windows/macOS/Linux通用方案
2.1 統(tǒng)一安裝工具:rustup
?? rustup是Rust官方唯一推薦的安裝工具,它可以:
- 安裝和管理多個(gè)Rust版本(如穩(wěn)定版、測(cè)試版、 nightly版)
- 安裝和管理不同的工具鏈(如x86_64-unknown-linux-gnu、wasm32-unknown-unknown)
- 配置Rust的環(huán)境變量和鏡像源
2.1.1 Windows安裝
?? 注意:Windows用戶需要先安裝Visual Studio Build Tools(C++編譯器),否則無(wú)法編譯Rust程序。
- 訪問(wèn)Rust官方網(wǎng)站:https://www.rust-lang.org/zh-CN/
- 點(diǎn)擊“下載Rust安裝程序”,選擇“Windows (64-bit)”
- 運(yùn)行下載的
rustup-init.exe,選擇默認(rèn)選項(xiàng)(按1鍵) - 安裝完成后,驗(yàn)證安裝:
打開(kāi)PowerShell或命令提示符,輸入以下命令:? 成功標(biāo)志:顯示rustc --version cargo --version
rustc 1.78.0 (9b00956e5 2024-04-29)和cargo 1.78.0 (54d8815d0 2024-03-26)類似的版本信息
2.1.2 macOS安裝
- 打開(kāi)終端(Terminal)
- 輸入以下命令下載并運(yùn)行rustup安裝腳本:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
- 按1鍵選擇默認(rèn)選項(xiàng)
- 驗(yàn)證安裝:
rustc --version cargo --version
2.1.3 Linux安裝(以Ubuntu/Debian為例)
- 打開(kāi)終端
- 更新系統(tǒng)軟件源并安裝依賴:
sudo apt update sudo apt install -y build-essential curl git
- 下載并運(yùn)行rustup安裝腳本:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
- 驗(yàn)證安裝:
rustc --version cargo --version
2.2 配置國(guó)內(nèi)鏡像源——加速依賴下載
?? 警告:由于網(wǎng)絡(luò)原因,直接從crates.io下載依賴可能會(huì)非常慢,甚至失敗。建議配置國(guó)內(nèi)鏡像源。
- 創(chuàng)建或編輯
~/.cargo/config.toml文件(Windows用戶路徑是C:\Users\你的用戶名\.cargo\config.toml) - 輸入以下內(nèi)容:
[source.crates-io] replace-with = 'ustc' [source.ustc] registry = "git://mirrors.ustc.edu.cn/crates.io-index" # 如果git協(xié)議訪問(wèn)慢,可以嘗試https協(xié)議 # registry = "https://mirrors.ustc.edu.cn/crates.io-index"
- 保存并退出
2.3 配置開(kāi)發(fā)工具
推薦使用VS Code作為Rust開(kāi)發(fā)IDE,因?yàn)樗蟹浅?qiáng)大的Rust插件支持。
2.3.1 安裝VS Code
訪問(wèn)VS Code官方網(wǎng)站:https://code.visualstudio.com/,下載并安裝對(duì)應(yīng)系統(tǒng)的版本。
2.3.2 安裝Rust相關(guān)插件
打開(kāi)VS Code,點(diǎn)擊左側(cè)的插件圖標(biāo)(Extensions),搜索并安裝以下插件:
- Rust Analyzer:由Rust官方團(tuán)隊(duì)主導(dǎo)開(kāi)發(fā),提供代碼補(bǔ)全、語(yǔ)法檢查、定義跳轉(zhuǎn)、重構(gòu)等核心功能
- CodeLLDB:用于Rust程序的調(diào)試
- Cargo:Cargo命令的集成支持
- Even Better TOML:用于格式化Cargo.toml等TOML配置文件
三、第一個(gè)Rust項(xiàng)目:從Hello, World!到可發(fā)布的CLI工具
3.1 使用Cargo創(chuàng)建標(biāo)準(zhǔn)項(xiàng)目
?? 操作步驟:
- 打開(kāi)終端(或VS Code的終端)
- 進(jìn)入你想存放項(xiàng)目的目錄,比如
~/projects - 輸入以下命令創(chuàng)建項(xiàng)目:
cargo new hello_rust_cli
- 進(jìn)入項(xiàng)目目錄:
cd hello_rust_cli
3.2 項(xiàng)目目錄結(jié)構(gòu)解析
?? 項(xiàng)目目錄結(jié)構(gòu):
hello_rust_cli/
├── Cargo.lock # 項(xiàng)目依賴的精確版本鎖定文件(自動(dòng)生成,不要手動(dòng)修改)
├── Cargo.toml # 項(xiàng)目配置文件(手動(dòng)編輯)
└── src/
└── main.rs # 主源碼文件(入口函數(shù)所在位置)
3.2.1 Cargo.toml內(nèi)容解析
[package] name = "hello_rust_cli" # 項(xiàng)目名稱(必須符合Rust的命名規(guī)范:小寫(xiě)字母+下劃線) version = "0.1.0" # 項(xiàng)目版本(遵循語(yǔ)義化版本控制:MAJOR.MINOR.PATCH) edition = "2021" # Rust的版本(目前最新穩(wěn)定版是2021) [dependencies] # 項(xiàng)目依賴的庫(kù)(可以手動(dòng)添加,也可以用cargo add命令)
3.2.2 src/main.rs內(nèi)容解析
// src/main.rs - Hello, Rust!的標(biāo)準(zhǔn)寫(xiě)法
fn main() {
println!("Hello, Rust World!");
}
fn main():Rust程序的入口函數(shù),Rust會(huì)自動(dòng)執(zhí)行這個(gè)函數(shù)println!():Rust的宏(不是函數(shù),注意后面的感嘆號(hào)),用于向控制臺(tái)輸出內(nèi)容
3.3 編譯、運(yùn)行、測(cè)試項(xiàng)目
3.3.1 編譯項(xiàng)目
cargo build # 編譯為debug版本(默認(rèn),用于開(kāi)發(fā)和調(diào)試) cargo build --release # 編譯為release版本(優(yōu)化后的,用于生產(chǎn)環(huán)境)
? 成功標(biāo)志:編譯完成后,會(huì)在target/debug/或target/release/目錄下生成可執(zhí)行文件。
3.3.2 運(yùn)行項(xiàng)目
cargo run # 同時(shí)完成編譯和運(yùn)行debug版本 cargo run --release # 同時(shí)完成編譯和運(yùn)行release版本
? 成功標(biāo)志:輸出Hello, Rust World!。
3.3.3 測(cè)試項(xiàng)目
Rust的測(cè)試功能非常強(qiáng)大,我們可以在src/main.rs中添加測(cè)試代碼,也可以創(chuàng)建專門的測(cè)試文件。
?? 測(cè)試代碼示例:
在src/main.rs的末尾添加以下代碼:
#[cfg(test)]
mod tests {
#[test]
fn test_hello_world() {
assert_eq!(1 + 1, 2); // 簡(jiǎn)單的測(cè)試斷言
}
}
運(yùn)行測(cè)試:
cargo test # 運(yùn)行所有測(cè)試
? 成功標(biāo)志:顯示test tests::test_hello_world ... ok。
3.4 擴(kuò)展項(xiàng)目:添加命令行參數(shù)支持
現(xiàn)在,我們要將Hello, Rust!擴(kuò)展為一個(gè)支持命令行參數(shù)的CLI工具,比如:
cargo run -- --name "張三"
輸出:Hello, 張三!
?? 操作步驟:
- 添加依賴:我們需要使用
clap庫(kù)來(lái)處理命令行參數(shù)cargo add clap --features derive
- 修改src/main.rs:
use clap::Parser; /// 一個(gè)簡(jiǎn)單的Hello, Rust! CLI工具 #[derive(Parser, Debug)] #[command(author, version, about, long_about = None)] struct Args { /// 你的名字 #[arg(short, long)] name: String, } fn main() { let args = Args::parse(); println!("Hello, {}!", args.name); } - 運(yùn)行擴(kuò)展后的項(xiàng)目:? 成功標(biāo)志:輸出
cargo run -- --name "張三"
Hello, 張三!。
3.5 調(diào)試項(xiàng)目
我們可以使用VS Code的CodeLLDB插件來(lái)調(diào)試Rust程序。
?? 操作步驟:
- 在VS Code中打開(kāi)項(xiàng)目
- 在src/main.rs的
println!()一行設(shè)置斷點(diǎn)(點(diǎn)擊行號(hào)左側(cè)的空白處) - 點(diǎn)擊左側(cè)的運(yùn)行圖標(biāo)(Run and Debug)
- 點(diǎn)擊“創(chuàng)建launch.json文件”,選擇“LLDB: Launch”
- 修改launch.json文件:
{ "version": "0.2.0", "configurations": [ { "name": "(lldb) Launch", "type": "lldb", "request": "launch", "program": "${workspaceFolder}/target/debug/hello_rust_cli", "args": ["--name", "張三"], "cwd": "${workspaceFolder}", "preLaunchTask": "cargo build" } ] } - 點(diǎn)擊“運(yùn)行”按鈕
- 程序會(huì)在斷點(diǎn)處停止,我們可以查看變量值、調(diào)用棧等信息
3.6 發(fā)布項(xiàng)目
我們可以使用Cargo將項(xiàng)目發(fā)布到crates.io上,供其他開(kāi)發(fā)者使用。
?? 注意:發(fā)布項(xiàng)目之前,你需要先在crates.io上注冊(cè)賬號(hào),并配置API密鑰。
?? 操作步驟:
在crates.io上注冊(cè)賬號(hào):https://crates.io/users/sign_up
配置API密鑰:
在終端中輸入以下命令:cargo login
然后輸入你在crates.io上獲得的API密鑰。
修改Cargo.toml文件:
添加作者、描述、倉(cāng)庫(kù)地址等信息:[package] name = "hello_rust_cli" version = "0.1.0" edition = "2021" authors = ["你的名字 <你的郵箱>"] description = "一個(gè)簡(jiǎn)單的Hello, Rust! CLI工具" repository = "https://github.com/你的用戶名/hello_rust_cli" readme = "README.md" license = "MIT" [dependencies] clap = { version = "4.5.4", features = ["derive"] }創(chuàng)建README.md文件:
# hello_rust_cli 一個(gè)簡(jiǎn)單的Hello, Rust! CLI工具。 ## 安裝 ```bash cargo install hello_rust_cli
使用
hello_rust_cli --name "張三"
輸出:
Hello, 張三!許可證
MIT
發(fā)布項(xiàng)目:
cargo publish
? 成功標(biāo)志:顯示
Updating crates.io index和Published hello_rust_cli v0.1.0。
四、Rust新手常見(jiàn)陷阱與避坑指南
4.1 混淆變量的可變性與不可變性
?? 陷阱:在Rust中,變量默認(rèn)是不可變的(immutable),如果你嘗試修改一個(gè)不可變變量,會(huì)導(dǎo)致編譯錯(cuò)誤。
?? 錯(cuò)誤示例:
fn main() {
let x = 5;
x = 6; // 編譯錯(cuò)誤:x is declared as immutable
}
? 避坑方法:如果你需要修改一個(gè)變量,必須在聲明時(shí)添加mut關(guān)鍵字:
fn main() {
let mut x = 5;
x = 6;
println!("x = {}", x); // 輸出x = 6
}
4.2 忘記處理Result類型
?? 陷阱:Rust中的很多函數(shù)會(huì)返回Result類型,它表示操作成功或失敗。如果你忘記處理Result類型,會(huì)導(dǎo)致編譯錯(cuò)誤。
?? 錯(cuò)誤示例:
use std::fs::File;
fn main() {
let file = File::open("test.txt"); // 返回Result<File, io::Error>
}
? 避坑方法:有三種方法處理Result類型:
- 使用match表達(dá)式:
use std::fs::File; use std::io::ErrorKind; fn main() { let file = File::open("test.txt"); match file { Ok(f) => println!("文件打開(kāi)成功"), Err(e) => match e.kind() { ErrorKind::NotFound => println!("文件不存在"), _ => println!("文件打開(kāi)失敗:{}", e), }, } } - 使用if let表達(dá)式:
use std::fs::File; fn main() { if let Ok(f) = File::open("test.txt") { println!("文件打開(kāi)成功"); } else { println!("文件打開(kāi)失敗"); } } - 使用?運(yùn)算符:
use std::fs::File; use std::io; fn read_file() -> io::Result<()> { let _file = File::open("test.txt")?; Ok(()) } fn main() { if let Err(e) = read_file() { println!("文件操作失?。簕}", e); } }
4.3 混淆引用與所有權(quán)
?? 陷阱:Rust的所有權(quán)系統(tǒng)是它最核心的內(nèi)存安全機(jī)制,也是最容易讓新手困惑的地方。簡(jiǎn)單來(lái)說(shuō),每個(gè)值都有且僅有一個(gè)所有者,當(dāng)所有者離開(kāi)作用域時(shí),值會(huì)被自動(dòng)釋放。
?? 錯(cuò)誤示例:
fn main() {
let s = String::from("hello");
takes_ownership(s); // s的所有權(quán)轉(zhuǎn)移到takes_ownership函數(shù)
println!("{}", s); // 編譯錯(cuò)誤:s已經(jīng)沒(méi)有所有權(quán)了
}
fn takes_ownership(s: String) {
println!("{}", s);
}
? 避坑方法:如果我們不想轉(zhuǎn)移所有權(quán),可以使用引用(reference):
fn main() {
let s = String::from("hello");
borrows_ownership(&s); // 傳遞s的引用
println!("{}", s); // 編譯成功:s的所有權(quán)還在
}
fn borrows_ownership(s: &String) {
println!("{}", s);
}
4.4 忘記處理生命周期
?? 陷阱:Rust的生命周期系統(tǒng)用于確保引用的有效性,防止出現(xiàn)懸垂引用。如果我們忘記處理生命周期,會(huì)導(dǎo)致編譯錯(cuò)誤。
?? 錯(cuò)誤示例:
fn main() {
let r;
{
let x = 5;
r = &x; // 編譯錯(cuò)誤:x的生命周期比r短
}
println!("{}", r);
}
? 避坑方法:確保引用的生命周期不超過(guò)所有者的生命周期:
fn main() {
let x = 5;
let r = &x;
println!("{}", r);
}
五、總結(jié)與展望
5.1 總結(jié)
? 完成了Rust開(kāi)發(fā)環(huán)境的完整搭建(Windows/macOS/Linux),配置了國(guó)內(nèi)鏡像源加速依賴下載
? 理解了Cargo作為Rust標(biāo)準(zhǔn)構(gòu)建系統(tǒng)和包管理器的核心功能
? 成功創(chuàng)建了第一個(gè)Rust項(xiàng)目Hello, Rust!,并將其擴(kuò)展為支持命令行參數(shù)的CLI工具
? 掌握了Rust程序的編譯、運(yùn)行、測(cè)試、調(diào)試、發(fā)布流程
? 了解了Rust新手常見(jiàn)的陷阱與避坑方法
到此這篇關(guān)于為什么要選Rust?學(xué)習(xí)Rust從零開(kāi)始配置和實(shí)現(xiàn)第一個(gè)簡(jiǎn)單項(xiàng)目的文章就介紹到這了,更多相關(guān)Rust配置和實(shí)現(xiàn)第一個(gè)項(xiàng)目?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 在win10上使用mingw64編譯器配置Rust開(kāi)發(fā)環(huán)境和idea 配置Rust 插件
- rust開(kāi)發(fā)環(huán)境配置詳細(xì)教程
- Rust語(yǔ)言的新手了解和學(xué)習(xí)入門啟蒙教程
- Rust中泛型的學(xué)習(xí)筆記
- Rust?枚舉的使用學(xué)習(xí)筆記
- Rust中箱、包和模塊的學(xué)習(xí)筆記
- rust多樣化錯(cuò)誤處理(從零學(xué)習(xí))
- 向Rust學(xué)習(xí)Go考慮簡(jiǎn)單字符串插值特性示例解析
- Rust個(gè)人學(xué)習(xí)小結(jié)之Rust的循環(huán)
相關(guān)文章
Rust語(yǔ)言從入門到精通之Tokio的Channel深入理解
這篇文章主要為大家介紹了Rust語(yǔ)言從入門到精通之Tokio的Channel深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
Rust 標(biāo)準(zhǔn)庫(kù)的結(jié)構(gòu)及模塊路徑詳解
在 Rust 中,標(biāo)準(zhǔn)庫(kù)提供了一組核心功能,以幫助開(kāi)發(fā)者執(zhí)行常見(jiàn)的編程任務(wù),這個(gè)路徑樹(shù)可以作為參考,幫助你更好地理解 Rust 標(biāo)準(zhǔn)庫(kù)的結(jié)構(gòu)和模塊之間的關(guān)系,本文介紹 Rust 標(biāo)準(zhǔn)庫(kù)的結(jié)構(gòu),并提供相應(yīng)的 use 路徑,感興趣的朋友一起看看吧2024-05-05
利用Rust實(shí)現(xiàn)一個(gè)簡(jiǎn)單的Ping應(yīng)用
這兩年Rust火的一塌糊涂,甚至都燒到了前端,再不學(xué)習(xí)怕是要落伍了。最近翻了翻文檔,寫(xiě)了個(gè)簡(jiǎn)單的Ping應(yīng)用練練手,感興趣的小伙伴可以了解一下2022-12-12
rust實(shí)現(xiàn)post小程序(完整代碼)
這篇文章主要介紹了rust實(shí)現(xiàn)一個(gè)post小程序,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-04-04
rust語(yǔ)言基礎(chǔ)pub關(guān)鍵字及Some語(yǔ)法示例
這篇文章主要為大家介紹了rust語(yǔ)言基礎(chǔ)pub關(guān)鍵字及Some語(yǔ)法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07

