从零开始学 Rust:环境搭建、基础语法到实战项目全流程
本文目录:
- 1. 环境搭建:5分钟完成 Rust 安装
- 配置国内镜像(可选,加速下载)
- 2. Hello World:第一个 Rust 程序
- 3. Cargo 工具链:Rust 的项目管理神器
- 创建新项目
- 查看 Cargo.toml
- 运行项目
- 常用 Cargo 命令
- 4. 基础语法速通:变量、函数、控制流
- 变量与可变性
- 数据类型
- 函数
- 控制流
- 5. 实战项目:构建一个简单的 Web API
- 创建项目
- 添加依赖
- 编写代码
- 运行服务器
- 测试 API
- 6. 常见问题解答
- Q1: 编译速度慢怎么办?
- Q2: 依赖下载失败?
- Q3: 如何调试程序?
- Q4: 如何组织大型项目?
- 总结
Rust 的核心优势在于它独特的所有权系统,近年来在开发者社区中获得了极高的关注度。它避免了传统 C/C++ 开发中常见的空指针、悬垂指针、数据竞争等问题。同时,Rust 的性能与 C++ 相当,本教程将从最基础的环境搭建开始,通过大量可直接运行的代码示例,帮助你快速入门 Rust 开发。
1. 环境搭建:5分钟完成 Rust 安装
想要去安装Rust,首先直接去到官网https://rustup.rs/ 下载 rustup-init.exe:

因为我自己的电脑是MAC,需要打开终端,执行:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
安装完成后,重启终端或执行:
source $HOME/.cargo/env
验证安装:
rustc --version
cargo --version
配置国内镜像(可选,加速下载)
配置国内镜像源可以显著提升下载速度,从几 KB/s 提升到几 MB/s。编辑 ~/.cargo/config 文件(Windows 在 %USERPROFILE%\.cargo\config),添加:
[source.crates-io]
replace-with = 'ustc'[source.ustc]
registry = "https://mirrors.ustc.edu.cn/crates.io-index"
2. Hello World:第一个 Rust 程序
创建一个文件 hello.rs:
fn main() {println!("Hello, Rust!");
}
编译并运行:
rustc hello.rs
./hello # Windows 上是 hello.exe
输出:

解释:
fn main()是程序入口println!是一个宏(注意感叹号),用于打印并换行- Rust 不需要分号结尾(但习惯上会加)
3. Cargo 工具链:Rust 的项目管理神器
创建新项目
cargo new my_project
cd my_project
这会生成如下结构:
my_project/
├── Cargo.toml # 项目配置文件
└── src/└── main.rs # 源代码
查看 Cargo.toml
[package]
name = "my_project"
version = "0.1.0"
edition = "2021"[dependencies]
# 这里添加依赖包
[package] 部分:定义包的元数据
name:项目名称,也是编译后可执行文件的名称。必须由字母、数字、下划线、连字符组成,不能包含空格
version:版本号,遵循语义化版本规范(SemVer)。格式是 主版本.次版本.补丁版本
edition:Rust 版本。Rust 每三年发布一个 edition,包含一些语言层面的变化。目前有 2015、2018、2021 三个 edition,推荐使用最新的 2021
[dependencies] 部分:声明项目依赖的外部库(crate)。目前是空的,我们马上会添加一些依赖。
运行项目
cargo run
输出:
Compiling my_project v0.1.0Finished dev [unoptimized + debuginfo] target(s) in 0.50sRunning `target/debug/my_project`
Hello, world!
常用 Cargo 命令
cargo new <项目名> # 创建新项目
cargo build # 编译项目(debug 模式)
cargo build --release # 编译项目(release 模式,优化)
cargo run # 编译并运行
cargo check # 快速检查代码是否能编译(不生成可执行文件)
cargo test # 运行测试
cargo doc --open # 生成并打开文档
4. 基础语法速通:变量、函数、控制流
变量与可变性
创建 src/main.rs:
fn main() {// 默认不可变let x = 5;println!("x = {}", x);// 需要加 mut 才能修改let mut y = 10;println!("y = {}", y);y = 20;println!("y changed to {}", y);// 常量必须标注类型const MAX_POINTS: u32 = 100_000;println!("MAX_POINTS = {}", MAX_POINTS);
}
运行 cargo run,输出:

数据类型
fn main() {// 整数类型let a: i32 = 42; // 有符号 32 位let b: u64 = 100; // 无符号 64 位// 浮点数let c: f64 = 3.14;// 布尔值let is_rust_fun: bool = true;// 字符(4字节,支持 Unicode)let emoji: char = '😀';// 字符串let s: &str = "Hello"; // 字符串切片(不可变)let s2: String = String::from("World"); // 可增长字符串println!("{} {} {} {} {} {}", a, b, c, is_rust_fun, emoji, s);
}
运行输出:

函数
fn main() {let result = add(5, 3);println!("5 + 3 = {}", result);greet("Alice");
}// 函数参数必须指定类型
fn add(x: i32, y: i32) -> i32 {x + y // 最后一行不加分号表示返回值
}fn greet(name: &str) {println!("Hello, {}!", name);
}
运行输出:

控制流
fn main() {// if 表达式let number = 6;if number % 2 == 0 {println!("{} is even", number);} else {println!("{} is odd", number);}// if 可以作为表达式let result = if number > 5 { "big" } else { "small" };println!("Number is {}", result);// loop 循环let mut count = 0;loop {count += 1;if count == 3 {break;}println!("count = {}", count);}// while 循环let mut n = 3;while n > 0 {println!("{}!", n);n -= 1;}// for 循环for i in 1..4 { // 1, 2, 3(不包含4)println!("i = {}", i);}// 遍历数组let arr = [10, 20, 30];for element in arr.iter() {println!("element = {}", element);}
}
运行输出:

文档注释支持 Markdown 语法,运行 cargo doc --open 可以生成漂亮的 HTML 文档。那我们现在已经掌握了 Rust 的基础语法。
5. 实战项目:构建一个简单的 Web API
创建项目
cargo new web_server
cd web_server
添加依赖
编辑 Cargo.toml,添加:
[dependencies]
actix-web = "4"
serde = { version = "1.0", features = ["derive"] }
编写代码
替换 src/main.rs:
use actix_web::{get, post, web, App, HttpResponse, HttpServer, Responder};
use serde::{Deserialize, Serialize};// 定义数据结构
#[derive(Serialize, Deserialize)]
struct User {name: String,age: u32,
}// GET 请求:返回首页
#[get("/")]
async fn index() -> impl Responder {HttpResponse::Ok().body("Welcome to Rust Web Server!")
}// GET 请求:返回用户信息
#[get("/user/{id}")]
async fn get_user(id: web::Path<u32>) -> impl Responder {let user = User {name: format!("User {}", id),age: 25,};HttpResponse::Ok().json(user)
}// POST 请求:接收 JSON 数据
#[post("/user")]
async fn create_user(user: web::Json<User>) -> impl Responder {println!("Received user: {} (age: {})", user.name, user.age);HttpResponse::Created().json(user.0)
}#[actix_web::main]
async fn main() -> std::io::Result<()> {println!("Server running at http://127.0.0.1:8080");HttpServer::new(|| {App::new().service(index).service(get_user).service(create_user)}).bind(("127.0.0.1", 8080))?.run().await
}
运行服务器
cargo run
看到输出:
Server running at http://127.0.0.1:8080
测试 API
测试首页(浏览器访问):
http://127.0.0.1:8080/
返回:
Welcome to Rust Web Server!
测试获取用户(浏览器或 curl):
curl http://127.0.0.1:8080/user/123
返回:
{"name":"User 123","age":25}
测试创建用户(使用 curl):
curl -X POST http://127.0.0.1:8080/user \-H "Content-Type: application/json" \-d '{"name":"Bob","age":28}'
返回:
{"name":"Bob","age":28}
服务器终端会打印:
Received user: Bob (age: 28)
6. 常见问题解答
Q1: 编译速度慢怎么办?
方案一:使用 cargo check 快速检查
cargo check # 只检查语法,不生成可执行文件
方案二:启用增量编译(默认已开启)
检查 Cargo.toml 中是否有:
[profile.dev]
incremental = true
方案三:使用 sccache 缓存编译结果
cargo install sccache
export RUSTC_WRAPPER=sccache
Q2: 依赖下载失败?
使用国内镜像源(前面已介绍),或者临时使用代理:
# Linux/macOS
export https_proxy=http://127.0.0.1:7890# Windows (PowerShell)
$env:https_proxy="http://127.0.0.1:7890"
Q3: 如何调试程序?
使用 println! 调试(最简单):
fn main() {let x = 5;println!("x = {:?}", x); // {:?} 用于调试输出
}
使用 dbg! 宏:
fn main() {let x = 5;dbg!(x); // 打印变量及其值,并返回所有权
}
使用 VSCode + rust-analyzer:
- 安装 VSCode
- 安装 rust-analyzer 扩展
- 安装 CodeLLDB 扩展
- F5 启动调试
Q4: 如何组织大型项目?
模块化示例:
项目结构:
my_project/
├── Cargo.toml
└── src/├── main.rs├── lib.rs└── models/└── user.rs
src/models/user.rs:
pub struct User {pub name: String,pub age: u32,
}impl User {pub fn new(name: String, age: u32) -> Self {User { name, age }}
}
src/lib.rs:
pub mod models;
src/main.rs:
use my_project::models::user::User;fn main() {let user = User::new(String::from("Alice"), 30);println!("User: {}", user.name);
}
总结
现在就开始你的 Rust 之旅吧!记住,每个代码示例都可以直接运行,遇到问题就动手试试,实践是最好的老师。
