适用人群:有其他语言基础,想学系统级编程
难度:中等
预计学习时间:40-60小时
为什么学 Rust?
| 优势 | 说明 |
|---|
| 内存安全 | 编译期保证无空指针、无数据竞争 |
| 性能 | 媲美C/C++,零成本抽象 |
| 并发 | 无畏并发(Fearless Concurrency) |
| 生态 | Cargo包管理器,crates.io生态丰富 |
| 就业 | 薪资最高语言之一,区块链/系统开发热门 |
学习路线
第1阶段:基础语法(2周)
├── 变量与可变性(let/mut)
├── 基本数据类型
├── 函数与控制流
├── 所有权系统(Rust核心!)
├── 引用与借用
└── 切片(Slice)
第2阶段:结构化编程(2周)
├── 结构体(Struct)
├── 枚举与模式匹配
├── 方法与关联函数
├── 错误处理(Result/Option)
└── 泛型与Trait
第3阶段:高级特性(3周)
├── 生命周期(Lifetime)
├── 闭包与迭代器
├── 智能指针(Box/Rc/Arc)
├── 并发编程(Thread/Mutex/Channel)
└── 异步编程(async/await)
第4阶段:实战项目(3周)
├── 命令行工具(clap)
├── Web服务器(Actix-web/Axum)
├── REST API开发
└── 系统编程项目
基础语法速查
// 变量与可变性
fn main() {
let x = 5; // 不可变
let mut y = 10; // 可变
y += 1;
// 所有权
let s1 = String::from("hello");
let s2 = s1; // s1的所有权转移到s2,s1不再可用
// println!("{}", s1); // 编译错误!
// 借用(引用)
let s3 = String::from("world");
let len = calculate_length(&s3); // 借用,不转移所有权
println!("{} has length {}", s3, len);
}
fn calculate_length(s: &String) -> usize {
s.len()
}
// 结构体
struct User {
username: String,
email: String,
age: u32,
}
impl User {
fn new(username: &str, email: &str, age: u32) -> Self {
User {
username: String::from(username),
email: String::from(email),
age,
}
}
fn greet(&self) -> String {
format!("Hi, I'm {}", self.username)
}
}
// 枚举与模式匹配
enum Coin {
Penny,
Nickel,
Dime,
Quarter(String), // 附带数据
}
fn value_in_cents(coin: &Coin) -> u32 {
match coin {
Coin::Penny => 1,
Coin::Nickel => 5,
Coin::Dime => 10,
Coin::Quarter(state) => {
println!("Quarter from {}", state);
25
}
}
}
// 错误处理
fn read_file(path: &str) -> Result<String, std::io::Error> {
std::fs::read_to_string(path)
}
fn main() {
match read_file("hello.txt") {
Ok(content) => println!("File content: {}", content),
Err(e) => println!("Error: {}", e),
}
// 简洁写法(?运算符)
// let content = read_file("hello.txt")?;
}
// 泛型与Trait
trait Summary {
fn summarize(&self) -> String;
}
struct Article {
title: String,
content: String,
}
impl Summary for Article {
fn summarize(&self) -> String {
format!("{}: {}...", &self.title, &self.content[..50])
}
}
// 并发
use std::thread;
use std::sync::{Arc, Mutex};
fn main() {
let counter = Arc::new(Mutex::new(0));
let mut handles = vec![];
for _ in 0..10 {
let counter = Arc::clone(&counter);
let handle = thread::spawn(move || {
let mut num = counter.lock().unwrap();
*num += 1;
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
println!("Result: {}", *counter.lock().unwrap());
}
推荐资源
| 资源 | 类型 | 说明 |
|---|
| The Rust Book | 官方教程 | 最权威的Rust入门书 |
| Rustlings | 练习 | 官方练习题集 |
| Rust by Example | 示例教程 | 通过例子学Rust |
| Exercism Rust Track | 练习 | 在线练习+导师反馈 |
| Tokio教程 | 异步 | Rust异步编程指南 |
实战项目建议
- 命令行TODO工具:练习基本语法、文件IO
- HTTP爬虫:练习异步编程、错误处理
- Web API服务:用Axum/Actix-web构建REST API
- 并发下载器:练习多线程、Channel通信
- 简易数据库:练习数据结构、文件操作
与其他语言对比
| 维度 | Rust | Go | C++ | Python |
|---|
| 学习曲线 | 陡峭 | 平缓 | 陡峭 | 平缓 |
| 性能 | 极高 | 高 | 极高 | 低 |
| 内存安全 | 编译期保证 | GC | 手动 | GC |
| 并发模型 | async+线程 | goroutine | 线程 | asyncio |
| 编译时间 | 慢 | 快 | 慢 | 无编译 |
| 适用场景 | 系统/后端/WebAssembly | 微服务/云原生 | 系统/游戏 | 数据/AI/脚本 |