@(绑定运算符)
在Rust中,@
被称为绑定运算符,用于在模式匹配的值绑定到一个变量,同时允许进一步解构内部结构。
具体解析
match self.reader.read(buf) {
Ok(len) => {
self.size -= len;
Ok(len)
}
err @ Err(_) => err
}
Ok(len)
分支:匹配成功的Ok
变体,提取内部的len
值,然后更新self.size
并返回Ok(len)
- **
err @ Err(_)
**分支:Err(_)
匹配任意Err
变体(不关心内部错误的具体值)@
将整个Err的值(如Err("io_error")
)绑定到变量err
- 分支返回
err
,即原始的Err
值
- 解构默认会发生所有权转移,
let Data(inner) = &data;
等价于let Data(ref inner) = &data;
AsRef
AsRef
trait的核心作用是允许一个类型以零开销的方式将自己或引用转换成另一种类型的引用。AsMut
是AsRef
的可变版本
1. 核心机制
AsRef<T>
定义了一个方法:fn as_ref(&self) -> &T
- 它接受
&self
,返回目标类型&T
的引用 - 本质上:将
&Self
转换为&T
2. 转换类型
- 允许的是
Self
到T
的引用转换。 - 例如:
String
实现AsRef<str>
:&String -> &str
Vec<T>
实现AsRef<[T]>
:&Vec<T> ->&[T]
PathBuf
实现AsRef<Path>
:&PathBuf -> &Path
**3. 设计目的 **
- 泛型灵活性:让函数接受多种类型参数
- 零开销抽象:转换过程无额外堆分配或复制
零开销
什么是零开销
- 栈操作和微小的寄存器复制是允许的
- 没有堆内存分配:绝不调用内存分配器
- 没有深拷贝:不复制底层数据本身(即使是栈上的解构也需要合理区分)
切片引用
切片引用本质就是宽指针,由数据指针和长度组成
Condvar
在rust中,Condvar
(条件变量)是用于线程间同步的核心工具,通常与Mutex
结合使用。它的核心功能是让线程在某个条件不满足时主动阻塞,直到其他线程修改条件并通知它继续执行。
- 作用:解决线程间的等待-通知问题,避免busy looping。
- 依赖:必须与
Mutex
配合使用(保护共享数据 + 同步条件) - 典型场景:生产者-消费者模型、任务队列调度、资源池管理等。
use std::sync::{Arc, Mutex, Condvar};
use std::thread;
fn main() {
//创建共享数据结构:(Mutex<bool>, Condvar)
let pair = Arc::new(Mutex::new(false), Condvar::new()));
let pair_clone = Arc::clone(&pair);
let consumer = thread::spawn(move || {
let (lock, cvar) = &*pair_clone;
let mut condition = lock.lock().unwarp();
//等条件满足
while !*condition {
//释放锁并阻塞,被唤醒后(wait返回后)重新获取锁
condition = cvar.wait(condition).unwarp();
}
println!("消费者:条件已满足!继续执行");
//消费者的处理逻辑
});
thread::sleep(Duration::from_secs(1));//模拟工作耗时
{
let (lock, cvar) = &*pair;
let mut condition = lock.lock().unwarp();
println!("生产者:更新条件并通知消费者...");
*condition = true;
// 通知一个等待的消费者线程
cvar.notify_one();
}
consumer.join().unwrap();
println!("主线程: 所有线程执行完成");
}
PIN
haystack
命名源自英语谚语“looking for a needle in a haystack”(大海捞针),haystack
表示被搜索的主体数据,needle
表示待查找的目标元素.
rust中有两种解引用的方式:*
和模式匹配解引用
Unicode、ASCII和UTF-8等
- Unicode为所有字符分配了唯一标识(称为码点)
- UTF-8等是需要将这些码点转换为用于存储/传输的字节序列,根据码点值的范围分类,确定字节序列的长度。
- ASCII是Unicode和UTF-8的特殊兼容子集
字符数据
b
前缀标识的数据:表示ASCII
字符集的字节数据,类型为u8
或&[u8]
&str
和&[u8]
:&str
是utf-8编码的切片引用且不可变,&[u8]
是对原始字节的切片引用,可变版本是&mut [u8]