阶段三:进阶(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. 异步网络爬虫
  • 异步请求网页
  • 并发抓取多个页面
  • 提取信息并保存
相关推荐
祈祷苍天赐我java之术2 分钟前
Redis 数据类型与使用场景
java·开发语言·前端·redis·分布式·spring·bootstrap
草莓熊Lotso1 小时前
C++ 方向 Web 自动化测试入门指南:从概念到 Selenium 实战
前端·c++·python·selenium
Olrookie1 小时前
若依前后端分离版学习笔记(二十)——实现滑块验证码(vue3)
java·前端·笔记·后端·学习·vue·ruoyi
533_2 小时前
[vue] dayjs 显示实时时间
前端·javascript·vue.js
故事与他6452 小时前
XSS_and_Mysql_file靶场攻略
前端·学习方法·xss
莫的感情3 小时前
下载按钮点击一次却下载两个文件问题
前端
一个很帅的帅哥3 小时前
JavaScript事件循环
开发语言·前端·javascript
小宁爱Python3 小时前
Django Web 开发系列(二):视图进阶、快捷函数与请求响应处理
前端·django·sqlite
fox_3 小时前
深入理解React中的不可变性:原理、价值与实践
前端·react.js
Github项目推荐3 小时前
你的错误处理一团糟-是时候修复它了-🛠️
前端·后端