Rust进阶[part7]_闭包
闭包概述
闭包是一个可以捕获所在环境中的变量的匿名函数
在Rust中,闭包通过||符号定义,可以像普通函数一样调用,但和函数不同,闭包可以访问外部作用域的变量
特点
匿名性:没有函数名,通常作为表达式使用
捕获环境:能自动捕获定义所在作用域中的变量(无需显式声明)
类型推断:参数和返回值类型可由编译器自动推断,无需显式标注
灵活语法:语法简洁,可根据复杂度调整写法(单行可省略{}和return)
实现trait:编译器会为闭包自动实现Fn、FnMut或FnOnce trait,使其能作为参数传递
语法
基本语法:|参数列表| 代码块(返回值由最后一行表达式决定)
// 无参数闭包
let hello = || println!("Hello, closure!");
hello(); // 调用闭包
// 单参数闭包(省略类型标注)
let square = |x| x * x;
println!("{}", square(5)); // 输出:25
// 多参数闭包(显式标注类型,可选)
let a ...
Rust进阶[part6]_宏
macro 概述
宏是 Rust 中强大的代码生成工具,与函数不同,它在编译期展开并生成具体代码,能处理可变参数、实现动态逻辑,语法上以 ! 结尾(如 println! vec! panic!)。
常用宏简化了重复操作:println! 处理格式化输出,vec! 快速创建向量,cfg! 做条件编译判断。宏支持模式匹配和代码生成,比函数更灵活,但也因编译期处理,调试和学习门槛稍高。按功能可分为声明宏(基于模式匹配)和过程宏(更复杂的代码生成),是 Rust 元编程的核心能力。
一些之前常用的宏,例如 println!、vec! 等,它们简化了代码编写。
声明宏
声明宏允许你通过模式匹配来生成代码。例如,下面是一个简单的加法声明宏:
macro_rules! add {
($a:expr, $b:expr) => {
$a + $b
};
}
fn main() {
let result = add!(1, 2);
println!("Result: ...
Rust进阶[part5]_trait
trait概述
在 Rust 中,trait 是一种定义共享行为的方式。它类似于其他语言中的接口,允许我们定义一组方法签名,然后让不同的类型去实现这些方法。通过 trait,我们可以实现多态性,即不同类型可以以统一的方式处理。
普通实现
使用 trait 关键字来声明一个特征
summary 是特征名
在大括号中定义了该特征的所有方法
// 定义一个 trait
trait Summary {
fn summarize(&self) -> String;
}
// 定义一个结构体
struct NewsArticle {
headline: String,
location: String,
author: String,
content: String,
}
// 为 NewsArticle 结构体实现 Summary trait
impl Summary for NewsArticle {
fn summarize(&se ...
Rust进阶[part4]_智能指针2
Rc<T>
Rc<T>(Reference Counted)是 Rust 标准库提供的单线程共享所有权智能指针,通过引用计数实现多所有权管理。以下是其核心特性与使用场景
核心特性
引用计数:
每个实例在堆上存储:
实际数据 T
引用计数器(记录活跃引用数量)
克隆时只增加计数器,不会深拷贝数据:
let a = Rc::new(vec![1,2,3]);
let b = a.clone(); // 计数器从1→2
最后一个引用离开作用域时释放内存
不可变共享:
所有者只能通过 .clone() 共享不可变引用
需配合RefCell<T>实现内部可变性:
let cell = Rc::new(RefCell::new(5));
*cell.borrow_mut() += 1;
使用场景
下面这个例子使用box可以实现链表的结构
enum list {
Cons(i32, Box<list>),
Nil,
}
fn main( ...
Rust进阶[part3]_生命周期
生命周期概述
在Rust中,生命周期是一种确保引用有效性的机制。Rust编译器通过生命周期注解来跟踪引用的作用域,防止出现悬空引用(dangling references)。
简单使用
下面是一个简单的生命周期注解示例:
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
} else {
y
}
}
fn main() {
let string1 = String::from("abcd");
let string2 = "xyz";
let result = longest(&string1, string2);
println!("The longest string is {}", result);
}
在这个例子 ...
Rust进阶[part2]_泛型
泛型概述
在定义函数时运用泛型,可将原本函数签名里明确指定参数和返回值类型的部分,用泛型来替代。这种方式能增强代码的适应性,为函数调用者赋予更多功能,还能避免代码重复。
fn add<T>(a:T, b:T) -> T{
a + b
}
不过,并非所有的T类型都能进行相加操作,此时会提示错误:
genertic_type.rs(5, 9): consider restricting type parameter 'T' with trait 'Add': ': std::ops::Add<Output = T>'
修正后的代码如下:
fn add<T: std::ops::Add<Output = T>>(a: T, b: T) -> T {
a + b
}
使用场景
在函数定义中使用泛型
fn largest<T: std::cmp::PartialOrd>(list: &[T]) -> &T {
let mut largest ...
Rust进阶[part1]_智能指针概述&box指针
智能指针概述
在Rust中,智能指针是一类特殊的数据结构,它们不仅像普通指针一样可以引用数据,还带有额外的元数据和功能。与普通指针不同,智能指针通常使用结构体实现,并且会实现 Deref 和 Drop 等特定的trait,以提供更强大的功能和更安全的内存管理。
智能指针在Rust编程中扮演着重要的角色,它们能够帮助开发者处理复杂的内存管理场景,确保程序的安全性和性能。例如,在处理动态大小的数据、递归数据结构或者需要自定义资源释放逻辑时,智能指针就显得尤为重要。
Box指针
内存分配到堆上
在Rust中,栈内存的分配和释放是自动且高效的,但栈空间是有限的。对于一些大型的数据结构或者需要在运行时动态确定大小的数据,将其存储在栈上可能会导致栈溢出。这时,我们可以使用 Box 指针将数据分配到堆上。
Box 是Rust标准库中最基本的智能指针之一,它允许我们在堆上分配内存,并将数据存储在其中。通过 Box 指针,我们可以在栈上存储一个指向堆上数据的引用,从而实现对堆上数据的访问。
以下是一个简单的示例,展示了如何使用 Box 将一个 ...
Rust基础[part9]_返回值和错误处理、模块化
返回值
Option<T>
基本使用
fn option_example() {
// 创建Option
let some_number = Some(5);
let some_string = Some("a string");
let absent_number: Option<i32> = None;
//使用
let x = plus_one(some_number);
let y = plus_one(absent_number);
println!("x: {:?}, y: {:?}", x, y);
}
fn plus_one(x: Option<i32>) -> Option<i32> {
match x {
None => None,
Some(i) => Some(i + 1),
} ...
Rust基础[part8]_模式匹配、常见集合
模式匹配
检查数据结构,提高代码的可读性和简洁性,减少错误,尤其在处理复杂数据结构的时候
基础模式匹配
fn match_example() {
let x = 5;
// 必须要有所有可能的case
match x {
1 => println!("one"),
2 => println!("two"),
3 => println!("three"),
_ => println!("something else"),
}
}
守卫
在模式匹配中,可以总使用守卫来添加额外的条件判断。
let x = 5;
match x {
n if n > 5 => println!("x is greater than 5"),
_ => println!("x is less than or equal to 5"),
}
绑定
在模式匹配中,可以使用绑定来将模式中的值绑定到变量 ...
Rust基础[part7]_枚举、结构体
枚举
枚举用于表示一个值可能是多种变体(Variant)中的一种。每个变体可以有不同的数据类型:
enum Message {
Quit, // 无数据
Move { x: i32, y: i32 }, // 带命名数据(类似结构体)
Write(String), // 带单个值(类似元组)
ChangeColor(i32, i32, i32), // 带多个值(类似元组)
}
基本使用
enum Pets {
Cat(String),
Dog { name: String, age: usize },
}
fn print_pet_info() {
let a = Pets::Cat("Whiskers".to_string());
let b = Pets::Dog {
name: "Buddy".to_st ...

![Rust进阶[part7]_闭包](https://img.soniachen.com/IMG_5493.jpg?_r_=99c266df-9cb8-cd44-ed1a-07256561709c)
![Rust进阶[part6]_宏](https://img.soniachen.com/IMG_5493.jpg?_r_=f057fe5c-c855-aac7-2612-8a5659a528f9)
![Rust进阶[part5]_trait](https://img.soniachen.com/IMG_5493.jpg?_r_=a614aced-e351-1ac6-1d8e-c153428aa237)
![Rust进阶[part4]_智能指针2](https://img.soniachen.com/IMG_5493.jpg?_r_=e5c50eca-953a-1018-fd06-17a1ca1a2347)
![Rust进阶[part3]_生命周期](https://img.soniachen.com/IMG_5493.jpg?_r_=1313b92f-267d-5238-2dbb-486679cc858d)
![Rust进阶[part2]_泛型](https://img.soniachen.com/IMG_5493.jpg?_r_=2fda2c83-8fd3-7c5a-caa2-af58c64ba57c)
![Rust进阶[part1]_智能指针概述&box指针](https://img.soniachen.com/IMG_5493.jpg?_r_=b6f7db47-9be1-17ba-bc3c-8886081a2b7a)
![Rust基础[part9]_返回值和错误处理、模块化](https://img.soniachen.com/IMG_5493.jpg?_r_=c9b6e8d7-d780-81c6-0a56-fa1dca81475b)
![Rust基础[part8]_模式匹配、常见集合](https://img.soniachen.com/IMG_5493.jpg?_r_=c43076fd-3c0d-6891-efb4-3038d564a154)
![Rust基础[part7]_枚举、结构体](https://img.soniachen.com/IMG_5493.jpg?_r_=0ff02b11-05dd-2be5-1552-708ed7960fb7)

