Rust学习 - Rust 简介

34 阅读6分钟

2026-04-02

今日目标

  • 理解 Rust 是什么,以及它的设计目标
  • 了解 Rust 的发展历史和主要特性
  • 掌握 Rust 的核心优势:内存安全、零成本抽象、并发安全
  • 完成 Rust 环境安装,创建第一个 Cargo 项目

核心概念

1. 什么是 Rust?

Rust 是一门系统级编程语言,由 Mozilla 研究院开发,于 2010 年首次发布

设计目标:

"Rust 是一门赋予每个人构建可靠且高效软件能力的语言。"

核心定位:

  • 🛡️ 内存安全 — 编译时防止内存错误
  • 高性能 — 零成本抽象,媲美 C/C++
  • 🧵 并发安全 — 编译时防止数据竞争
  • 🎯 可靠性 — 丰富的类型系统和错误处理

2. Rust 的发展历史

2006  Graydon Hoare 开始设计 Rust
    
2010  Mozilla 正式发布 Rust 0.1
    
2012  Rust 进入自举(用 Rust  Rust 编译器)
    
2015  Rust 1.0 稳定版发布 🎉
    
2016  Rust 成为 Stack Overflow 最受欢迎语言
    
2020  Linux 内核开始接受 Rust 代码
    
2021  Rust 基金会成立
    
2023  Linux 6.1 正式支持 Rust
    
2024+  Rust 持续繁荣,云原生领域广泛应用

重要里程碑:

  • 2015 — Rust 1.0 发布,承诺稳定 API
  • 2018 — Rust 2018 Edition,模块系统改进
  • 2021 — Rust 2021 Edition,新特性引入
  • 2023 — 进入 Linux 内核,成为系统编程新选择

3. Rust 的核心特性

3.1 内存安全(Memory Safety)

传统语言的内存问题:

问题C/C++Java/GoRust
空指针❌ 运行时崩溃✅ GC 保护✅ 编译时检查
悬垂指针❌ 未定义行为✅ GC 保护✅ 所有权检查
缓冲区溢出❌ 安全漏洞✅ 边界检查✅ 编译时检查
数据竞争❌ 难以调试✅ 运行时检查✅ 编译时检查
内存泄漏❌ 可能发生✅ GC 回收⚠️ 可能(但少见)

Rust 的解决方案:所有权系统

// 所有权规则(编译时检查)
// 1. 每个值有且只有一个所有者
// 2. 当所有者离开作用域,值被释放
// 3. 所有权可以转移(Move)

let s1 = String::from("hello");  // s1 拥有这个字符串
let s2 = s1;                       // 所有权转移给 s2
// println!("{}", s1);           // ❌ 编译错误!s1 不再有效
3.2 零成本抽象(Zero-Cost Abstractions)

什么是零成本抽象?

高级特性不带来运行时开销,编译后代码与手写 C 一样高效。

// 高级抽象:迭代器
let sum: i32 = (1..=100).filter(|x| x % 2 == 0).sum();

// 编译后 ≈ 手写循环,性能相同
// 没有运行时开销!

对比其他语言:

  • Java — 泛型有装箱拆箱开销
  • C++ — 模板编译慢,代码膨胀
  • Rust — 单态化(Monomorphization),零开销
3.3 并发安全(Fearless Concurrency)

Rust 的并发模型:

┌─────────────────────────────────────────────┐
│           Rust 并发安全保证                      │
├─────────────────────────────────────────────┤
│                                            │
│  编译时检查 + 类型系统 = 无数据竞争          │
│                                            │
│  Send trait ──→ 可以跨线程传递所有权        │
│  Sync trait ──→ 可以跨线程共享引用        │
│                                            │
│  违反规则?编译错误!不是运行时崩溃           │
│                                            │
└─────────────────────────────────────────────┘

示例:

use std::thread;

let data = vec![1, 2, 3];

// ❌ 编译错误!不能同时读写
thread::spawn(|| {
    data.push(4);  // 错误:不能捕获可变引用
});

println!("{:?}", data);  // 这里也在使用 data

4. Rust 的应用场景

领域代表项目优势
系统编程Linux 内核、Redox OS替代 C/C++,更安全
Web 后端Actix、Tokio、Axum高性能,低延迟
区块链Solana、Substrate安全、高效
游戏引擎Bevy、Fyrox性能 + 安全
CLI 工具ripgrep、fd、exa快速、可靠
WebAssemblywasm-bindgen、Yew前端新选择
嵌入式Embassy、RTIC无运行时开销

5. Rust vs 其他语言

性能:     C/C++ ≈ Rust > Go > Java > Python
安全性:     Rust > Go/Java > Python > C/C++
开发效率:   Python > Go > Rust > Java > C/C++
学习曲线:   Rust > C++ > Java > Go > Python

Rust 的独特位置:

  • 性能接近 C/C++
  • 安全性超越 Java/Go
  • 现代语言特性(模式匹配、代数数据类型)

代码实例

实例1:Hello World

// main.rs
fn main() {
    println!("Hello, world!");
}

运行:

$ rustc main.rs
$ ./main
Hello, world!

实例2:Cargo 项目结构

# 创建新项目
$ cargo new hello_cargo
$ cd hello_cargo

# 查看项目结构
$ tree
hello_cargo/
├── Cargo.toml    # 项目配置和依赖
└── src/
    └── main.rs   # 主代码

# Cargo.toml 内容
[package]
name = "hello_cargo"
version = "0.1.0"
edition = "2021"

[dependencies]

# src/main.rs
fn main() {
    println!("Hello, Cargo!");
}

实例3:Cargo 常用命令

# 构建项目
cargo build              # 开发构建(debug)
cargo build --release   # 发布构建(优化)

# 运行项目
cargo run              # 编译并运行
cargo run --release   # 发布模式运行

# 测试
cargo test             # 运行测试

# 检查代码(不编译)
cargo check          # 快速检查语法和类型

# 生成文档
cargo doc            # 生成文档
cargo doc --open    # 生成并打开

# 格式化代码
cargo fmt

# 代码检查
cargo clippy         # Rust 的 lint 工具

# 更新依赖
cargo update

实例4:变量和可变性

fn main() {
    // 不可变变量
    let x = 5;
    // x = 6;  // ❌ 错误!不能修改不可变变量
    
    // 可变变量
    let mut y = 5;
    y = 6;  // ✅ 可以修改
    
    // 常量
    const MAX_POINTS: u32 = 100_000;
    
    // 遮蔽(Shadowing)
    let x = x + 1;  // 新的 x,遮蔽旧的 x
    let x = x * 2;
    
    println!("x = {}", x);  // x = 12
    println!("y = {}", y);  // y = 6
}

练习题

练习1:创建第一个 Cargo 项目

任务:

  1. 使用 cargo new 创建一个名为 my_first_rust 的项目
  2. 修改 main.rs,输出你的名字和一句问候语
  3. 使用 cargo run 运行

提示:

fn main() {
    let name = "你的名字";
    println!("Hello, {}! Welcome to Rust!", name);
}

练习2:变量可变性

任务: 编写程序完成以下操作:

  1. 声明一个不可变变量 temperature,初始值为 25
  2. 尝试修改它(观察编译错误)
  3. 改为可变变量,成功修改

参考答案:

点击展开
fn main() {
    // let temperature = 25;
    // temperature = 30;  // 编译错误!
    
    let mut temperature = 25;
    println!("当前温度: {}", temperature);
    
    temperature = 30;
    println!("更新后温度: {}", temperature);
}

练习3:探索 Cargo.toml

任务:

  1. 打开 Cargo.toml 文件
  2. 添加一个依赖(如 rand = "0.8"
  3. 运行 cargo build 观察下载依赖过程
  4. 查看 Cargo.lock 文件

常见问题

Q1: Rust 为什么学习曲线陡峭?

原因:

  1. 所有权系统 — 新概念,需要时间理解
  2. 编译器严格 — 错误信息多,但非常友好
  3. 生命周期 — 引用有效性管理

建议:

  • 耐心阅读编译错误信息(Rust 的错误提示很详细)
  • 多写代码,在实践中理解
  • 使用 rustlings 练习

Q2: Rust 有垃圾回收吗?

没有! Rust 通过所有权系统在编译时管理内存:

  • 离开作用域自动释放
  • 无运行时 GC 开销
  • 可预测的性能

Q3: Rust 适合做什么?

特别适合:

  • 系统编程(操作系统、驱动)
  • 高性能服务(Web 后端)
  • 嵌入式开发
  • WebAssembly
  • CLI 工具

不太适合:

  • 快速原型(Python 更快)
  • 简单脚本
  • 团队没有 Rust 经验的大型项目

Q4: 如何学习 Rust?

推荐路径:

  1. 阅读《Rust 程序设计语言》(官方教程)
  2. 完成 rustlings 练习
  3. 做项目实践
  4. 阅读源码

最佳实践

1. 使用 Cargo

总是用 Cargo 管理项目,不要直接用 rustc。

2. 善用编译错误

Rust 编译错误非常详细,仔细阅读错误信息

3. 遵循命名规范

  • 函数/变量:snake_case
  • 类型/结构体:PascalCase
  • 常量:SCREAMING_SNAKE_CASE

4. 使用 rustfmt 和 clippy

cargo fmt      # 自动格式化
cargo clippy   # 代码检查

参考资料

  1. Rust 程序设计语言 - 官方教程
  2. Rust by Example
  3. Rustlings - 练习项目
  4. crates.io - Rust 包仓库

Date: 2026-04-02