从零开始学 Rust:环境搭建、基础语法到实战项目全流程
本文目录:
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.0
Finished dev [unoptimized + debuginfo] target(s) in 0.50s
Running `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 之旅吧!记住,每个代码示例都可以直接运行,遇到问题就动手试试,实践是最好的老师。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)