目标
将 Rust 应用到真实项目中,掌握生态与工具链,能独立开发 CLI、Web 和网络应用。
1. CLI 工具
使用 clap / structopt
rust
use clap::Parser;
#[derive(Parser)]
struct Args {
#[clap(short, long)]
name: String,
#[clap(short, long, default_value_t = 1)]
count: u32,
}
fn main() {
let args = Args::parse();
for _ in 0..args.count {
println!("Hello, {}!", args.name);
}
}
cargo build --release
打包为二进制文件- 文件操作:
rust
use std::fs::File;
use std::io::Write;
let mut file = File::create("output.txt").expect("创建文件失败");
file.write_all(b"Hello, Rust CLI!").expect("写入失败");
2. Web 开发
使用 Actix-web 创建 REST API
rust
use actix_web::{get, post, web, App, HttpServer, Responder};
#[get("/")]
async fn hello() -> impl Responder {
"Hello, world!"
}
#[post("/echo")]
async fn echo(msg: String) -> impl Responder {
msg
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| App::new().service(hello).service(echo))
.bind("127.0.0.1:8080")?
.run()
.await
}
JSON 序列化与反序列化
css
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize)]
struct User {
id: u32,
name: String,
}
let user = User { id: 1, name: "Eric".to_string() };
let json = serde_json::to_string(&user).unwrap();
let back: User = serde_json::from_str(&json).unwrap();
3. 数据库
使用 sqlx
rust
use sqlx::postgres::PgPoolOptions;
#[tokio::main]
async fn main() -> Result<(), sqlx::Error> {
let pool = PgPoolOptions::new()
.max_connections(5)
.connect("postgres://user:password@localhost/dbname")
.await?;
let row: (i32,) = sqlx::query_as("SELECT 1")
.fetch_one(&pool)
.await?;
println!("结果: {}", row.0);
Ok(())
}
- Diesel 也可用于类型安全的 ORM
- 异步数据库操作可以使用
sqlx::query
+await
- 支持事务:
rust
let mut tx = pool.begin().await?;
sqlx::query("INSERT INTO users (name) VALUES ($1)").bind("Eric").execute(&mut tx).await?;
tx.commit().await?;
4. 网络与异步
TCP 客户端
rust
use tokio::net::TcpStream;
use tokio::io::{self, AsyncWriteExt};
#[tokio::main]
async fn main() -> io::Result<()> {
let mut stream = TcpStream::connect("127.0.0.1:8080").await?;
stream.write_all(b"Hello server!").await?;
Ok(())
}
HTTP 请求(reqwest)
rust
use reqwest::Error;
#[tokio::main]
async fn main() -> Result<(), Error> {
let res = reqwest::get("https://www.rust-lang.org").await?;
let body = res.text().await?;
println!("{}", &body[0..100]);
Ok(())
}
5. 测试与调试
单元测试
rust
fn add(a: i32, b: i32) -> i32 { a + b }
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_add() {
assert_eq!(add(2, 3), 5);
}
}
集成测试
- 在
tests/
文件夹下创建独立测试文件 cargo test
自动运行
代码检查与格式化
bash
cargo clippy # 静态分析
cargo fmt # 自动格式化
练习项目
- 命令行文件管理工具
- 支持复制、移动、删除文件
- 参数解析:输入源路径和目标路径
- 输出操作日志
- RESTful API 服务
- CRUD 操作(Create, Read, Update, Delete)
- 数据库持久化(Postgres / SQLite)
- JSON 接口返回
- 简易聊天室
- TCP 或 WebSocket 实现
- 多线程/异步处理多客户端
- 支持发送/接收消息