Skip to content

实战项目

通过实际项目来学习 Rust 是最有效的方式。这里提供了一些项目建议和实现指南。

入门项目

1. 命令行工具

项目描述

创建一个类似 grep 的文件搜索工具,从命令行读取参数并搜索文件。

学习要点

  • 命令行参数解析(clap)
  • 文件读写操作
  • 错误处理
  • 测试

推荐资源

关键代码

rust
use std::env;
use std::fs;

fn main() {
    let args: Vec<String> = env::args().collect();

    let query = &args[1];
    let filename = &args[2];

    println!("搜索: {}", query);
    println!("文件: {}", filename);

    let contents = fs::read_to_string(filename)
        .expect("读取文件失败");

    println!("\\n文件内容:\\n{}", contents);
}

2. 温度转换器

项目描述

将摄氏度转换为华氏度和开尔文,反之亦然。

学习要点

  • 基本数据类型
  • 函数定义
  • 错误处理
  • 单元测试

关键代码

rust
fn celsius_to_fahrenheit(celsius: f64) -> f64 {
    celsius * 9.0 / 5.0 + 32.0
}

fn celsius_to_kelvin(celsius: f64) -> f64 {
    celsius + 273.15
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_celsius_to_fahrenheit() {
        assert_eq!(celsius_to_fahrenheit(0.0), 32.0);
        assert_eq!(celsius_to_fahrenheit(100.0), 212.0);
    }
}

3. 待办事项 CLI

项目描述

一个命令行的待办事项管理工具。

学习要点

  • 数据持久化
  • 结构体和枚举
  • 命令行界面
  • JSON 处理

关键代码

rust
use serde::{Deserialize, Serialize};

#[derive(Debug, Serialize, Deserialize)]
struct Todo {
    id: u32,
    title: String,
    completed: bool,
}

fn main() {
    let todo = Todo {
        id: 1,
        title: String::from("学习 Rust"),
        completed: false,
    };

    let json = serde_json::to_string(&todo).unwrap();
    println!("{}", json);
}

中级项目

4. 简单的 Web 服务器

项目描述

使用 Actix Web 或 Axum 创建一个 REST API 服务器。

学习要点

  • Web 框架使用
  • 异步编程
  • 数据库集成
  • 错误处理

推荐框架

关键代码

rust
use actix_web::{get, web, App, HttpServer, Responder};

#[get("/hello/{name}")]
async fn hello(name: web::Path<String>) -> impl Responder {
    format!("Hello {}!", name)
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| {
        App::new().service(hello)
    })
    .bind(("127.0.0.1", 8080))?
    .run()
    .await
}

5. 聊天应用

项目描述

一个支持多用户的实时聊天应用。

学习要点

  • WebSocket
  • 并发编程
  • 消息传递
  • 异步 I/O

推荐库

6. 文件同步工具

项目描述

监控文件变化并同步到远程服务器。

学习要点

  • 文件系统监控
  • 网络编程
  • 并发处理
  • 增量同步

推荐库

高级项目

7. 区块链节点

项目描述

实现一个简单的区块链节点,支持挖矿和交易。

学习要点

  • 加密算法
  • 数据结构设计
  • 网络协议
  • 共识机制

推荐库

关键代码

rust
use sha2::{Sha256, Digest};
use serde::{Deserialize, Serialize};

#[derive(Debug, Serialize, Deserialize)]
struct Block {
    index: u64,
    timestamp: u64,
    data: String,
    previous_hash: String,
    hash: String,
}

impl Block {
    fn calculate_hash(&self) -> String {
        let data = format!("{}{}{}{}", self.index, self.timestamp, self.data, self.previous_hash);
        let mut hasher = Sha256::new();
        hasher.update(data.as_bytes());
        format!("{:x}", hasher.finalize())
    }
}

8. 游戏引擎组件

项目描述

为 Bevy 游戏引擎开发自定义系统或插件。

学习要点

  • ECS 架构
  • 游戏编程
  • 性能优化
  • 并行处理

推荐资源

9. 操作系统组件

项目描述

编写一个简单的操作系统内核组件或驱动程序。

学习要点

  • 系统编程
  • 内存管理
  • 中断处理
  • 硬件交互

推荐资源

微型项目

快速练习

  1. FizzBuzz - 打印 1-100,3的倍数打印Fizz,5的倍数打印Buzz
  2. 素数生成器 - 生成指定范围内的素数
  3. 密码生成器 - 生成安全的随机密码
  4. URL 缩短器 - 实现一个简单的 URL 缩短服务
  5. Markdown 解析器 - 将 Markdown 转换为 HTML

数据结构实现

  1. 链表 - 实现双向链表
  2. 二叉树 - 实现二叉搜索树
  3. 哈希表 - 实现简单的哈希表
  4. 栈和队列 - 实现栈和队列数据结构

算法练习

  1. 排序算法 - 实现快速排序、归并排序
  2. 搜索算法 - 实现二分搜索
  3. 图算法 - 实现最短路径算法
  4. 动态规划 - 解决经典 DP 问题

项目模板

Cargo 项目结构

my_project/
├── Cargo.toml          # 项目配置
├── Cargo.lock          # 依赖锁定
├── src/
│   ├── main.rs         # 主程序入口
│   ├── lib.rs          # 库入口
│   └── modules/        # 模块文件
├── tests/              # 集成测试
├── benches/            # 性能测试
└── examples/           # 示例代码

常用依赖

toml
[dependencies]
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
tokio = { version = "1", features = ["full"] }
clap = { version = "4", features = ["derive"] }
anyhow = "1.0"
tracing = "0.1"

学习建议

循序渐进

  1. 从简单项目开始,逐步增加复杂度
  2. 每个项目专注于几个关键概念
  3. 重复使用学到的知识,加深理解

注重质量

  1. 编写测试用例
  2. 添加文档注释
  3. 遵循 Rust 编码规范
  4. 使用 clippy 检查代码

贡献开源

  1. 参与现有 Rust 项目
  2. 提交 Issue 和 Pull Request
  3. 学习他人的代码风格
  4. 获得代码审查反馈

项目展示

提交你的项目

完成项目后,可以考虑:

  • 发布到 GitHub
  • 写博客分享
  • 发布到 crates.io
  • 参与社区讨论

学习资源


记住:最好的学习方式就是动手实践。选择一个项目,开始编码吧!