50 - Rust 入门教程

适用人群:有其他语言基础,想学系统级编程
难度:中等
预计学习时间: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异步编程指南

实战项目建议

  1. 命令行TODO工具:练习基本语法、文件IO
  2. HTTP爬虫:练习异步编程、错误处理
  3. Web API服务:用Axum/Actix-web构建REST API
  4. 并发下载器:练习多线程、Channel通信
  5. 简易数据库:练习数据结构、文件操作

与其他语言对比

维度RustGoC++Python
学习曲线陡峭平缓陡峭平缓
性能极高极高
内存安全编译期保证GC手动GC
并发模型async+线程goroutine线程asyncio
编译时间无编译
适用场景系统/后端/WebAssembly微服务/云原生系统/游戏数据/AI/脚本
返回首页