阶段三:进阶(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. 异步网络爬虫
  • 异步请求网页
  • 并发抓取多个页面
  • 提取信息并保存
相关推荐
yinuo1 小时前
uniapp微信小程序华为鸿蒙定时器熄屏停止
前端
gnip2 小时前
vite中自动根据约定目录生成路由配置
前端·javascript
前端橙一陈3 小时前
LocalStorage Token vs HttpOnly Cookie 认证方案
前端·spring boot
~无忧花开~3 小时前
JavaScript学习笔记(十五):ES6模板字符串使用指南
开发语言·前端·javascript·vue.js·学习·es6·js
泰迪智能科技013 小时前
图书推荐丨Web数据可视化(ECharts 5)(微课版)
前端·信息可视化·echarts
CodeCraft Studio4 小时前
借助Aspose.Email,使用 Python 读取 Outlook MSG 文件
前端·python·outlook·aspose·email·msg·python读取msg文件
红烧code4 小时前
【Rust GUI开发入门】编写一个本地音乐播放器(4. 绘制按钮组件)
rust·gui·svg·slint
家里有只小肥猫5 小时前
react 初体验2
前端·react.js·前端框架
慧慧吖@5 小时前
前端发送请求时,参数的传递格式
前端
L李什么李5 小时前
HTML——使用表格制作简历
前端·javascript·html