阶段三:进阶(Rust 高级特性)

目标

掌握泛型、特征(Trait)、智能指针、并发和异步编程。


1. 泛型与特征(Trait)

泛型函数

ini 复制代码
fn largest<T: PartialOrd>(list: &[T]) -> &T {
    let mut largest = &list[0];
    for item in list {
        if item > largest {
            largest = item;
        }
    }
    largest
}

fn main() {
    let numbers = vec![34, 50, 25, 100, 65];
    println!("最大值: {}", largest(&numbers));
}

泛型结构体

ini 复制代码
struct Point<T> {
    x: T,
    y: T,
}

fn main() {
    let p1 = Point { x: 5, y: 10 };
    let p2 = Point { x: 1.0, y: 4.0 };
}

Trait 定义与实现

rust 复制代码
trait Summary {
    fn summarize(&self) -> String;
}

struct NewsArticle {
    headline: String,
    author: String,
}

impl Summary for NewsArticle {
    fn summarize(&self) -> String {
        format!("{} by {}", self.headline, self.author)
    }
}

fn main() {
    let article = NewsArticle { headline: "Rust 进阶".to_string(), author: "Eric".to_string() };
    println!("{}", article.summarize());
}

Trait bound 与 impl Trait

rust 复制代码
fn notify(item: &impl Summary) {
    println!("Breaking news! {}", item.summarize());
}

常用 Trait

  • Debug:打印调试信息
  • Clone:深拷贝
  • Copy:轻量类型拷贝
  • Drop:自定义释放逻辑

2. 智能指针

Box:堆分配

css 复制代码
let b = Box::new(5);
println!("b = {}", b);

Rc:引用计数

css 复制代码
use std::rc::Rc;

let a = Rc::new(5);
let b = Rc::clone(&a);
println!("引用计数: {}", Rc::strong_count(&a));

Arc:线程安全引用计数

rust 复制代码
use std::sync::Arc;
use std::thread;

let a = Arc::new(5);
let mut handles = vec![];

for _ in 0..3 {
    let a = Arc::clone(&a);
    let handle = thread::spawn(move || {
        println!("{}", a);
    });
    handles.push(handle);
}

for h in handles {
    h.join().unwrap();
}

RefCell:内部可变性

rust 复制代码
use std::cell::RefCell;

let x = RefCell::new(5);
* x.borrow_mut() += 1;
println!("{}", x.borrow());

3. 并发编程

线程

rust 复制代码
use std::thread;

let handle = thread::spawn(|| {
    for i in 1..5 {
        println!("子线程 {}", i);
    }
});

for i in 1..5 {
    println!("主线程 {}", i);
}

handle.join().unwrap();

Mutex 与 RwLock

ini 复制代码
use std::sync::{Arc, Mutex};
use std::thread;

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 h in handles {
    h.join().unwrap();
}

println!("结果: {}", *counter.lock().unwrap());

channels 消息传递

rust 复制代码
use std::sync::mpsc;
use std::thread;

let (tx, rx) = mpsc::channel();

thread::spawn(move || {
    tx.send("Hello from thread").unwrap();
});

println!("{}", rx.recv().unwrap());

4. 异步编程

async / await

rust 复制代码
use tokio::time::{sleep, Duration};

#[tokio::main]
async fn main() {
    println!("开始");
    sleep(Duration::from_secs(2)).await;
    println!("两秒后输出");
}

Future trait

rust 复制代码
use std::future::Future;

async fn hello() {
    println!("Hello async");
}

fn main() {
    let f: impl Future<Output=()> = hello();
    futures::executor::block_on(f);
}

tokio / async-std

  • tokio:高性能异步运行时
  • async-std:更接近标准库风格
  • 异步 I/O、HTTP 请求、数据库访问

练习建议

  1. 多线程下载器
  • 给定 URL 列表
  • 每个 URL 用一个线程下载
  • 保存到本地文件
  1. 异步网络爬虫
  • 异步请求网页
  • 并发抓取多个页面
  • 提取信息并保存
相关推荐
Cutecat_2 小时前
视频字幕处理工具横向:提取模式 vs 编辑模式,该如何选择
android·前端·ios·语音识别
qq_422152572 小时前
PDF 加水印工具怎么选?2026 年文档版权保护方案对比
前端·pdf·github
kyriewen2 小时前
手写 Promise.all、race、any:不到 30 行代码,解决并发异步的所有姿势
前端·javascript·面试
brucelee1863 小时前
OpenClaw 浏览器控制(Chrome MCP)完整教程
前端·chrome
ct9784 小时前
React 状态管理方案深度对比
开发语言·前端·react
胡志辉的博客4 小时前
深入浅出理解浏览器事件循环:从一道输出题讲到 Chrome 源码
前端·javascript·chrome·chromium·event loop
代码不加糖4 小时前
js中不会冒泡的事件有哪些?
前端·javascript·vue.js
懂懂tty4 小时前
Vue2与Vue3之间API差异
前端·javascript·vue.js
AI焦点4 小时前
跨越协议鸿沟:Tool Use状态机从Anthropic到OpenAI兼容体系的适配要点
前端·人工智能
Dxy12393102164 小时前
Python线程锁:为什么多线程会“打架“,以及怎么解决
开发语言·前端·python