Rust基础
huangjj27.github.io/interview.h…
生命周期
智能指针
Box<T> 堆上分配值并在离开作用域时自动释放内存
Rc<T> 单线程,多个指针指向同一个值,当最后一个指针离开作用域时,值将被释放
Arc<T> 多线程,多个指针指向同一个值,当最后一个指针离开作用域时,值将被释放
Cell<T> 允许你在不可变引用的情况下修改内部值,只能用于`Copy`类型
`get()`:获取 `Cell<T>` 中存储的值的不可变引用。
`set(value: T)`:将新的值存储到 `Cell<T>` 中,替换旧值。
`replace(&self, value: T) -> T`:替换 `Cell<T>` 中存储的值,并返回旧值。
`into_inner(self) -> T`:从 `Cell<T>` 中提取存储的值,并返回它本身。
RefCell<T> 允许你在不可变引用的情况下修改内部值,可以用于非`Copy`类型
`Ref<T>` 是 `RefCell<T>` 内部值的不可变借用。通过 `borrow()` 方法获取,它提供了对 `RefCell<T>` 内部值的不可变访问。
`RefMut<T>` 是 `RefCell<T>` 内部值的可变借用。通过 `borrow_mut()` 方法获取,它提供了对 `RefCell<T>` 内部值的可变访问。
UnSafeCell<T> 允许你在不可变引用的情况下修改内部值,不提供任何运行时检查来确保安全性
Weak<T> 弱引用,不会增加引用计数,因此它不会阻止值被释放。当你希望创建一个循环引用时,可以使用`Rc<T>`或`Arc<T>`和`Weak<T>`来实现。
as
.as_ref() 将 Option 或 Result 中的值转换为其引用类型 &T 或 Option<&T>
.as_mut() 将 Option 或 Result 中的值转换为其可变引用类型 &mut T 或 Option<&mut T>
.as_deref() 将 Option 或 Result 中的值转换为其引用类型 &U,其中 U 实现了 Deref<Target = T>,
这个方法主要用于处理 Box<str> 或 String 等需要字符串切片 &str 的场景
.as_deref_mut() 将 Option 或 Result 中的值转换为其可变引用类型 &mut U,其中 U 实现了 DerefMut<Target = T>,
这个方法主要用于处理 Box<str> 或 String 等需要可变字符串切片 &mut str 的场景
宏
Send 和 Sync
Pin 和 Unpin
Rust 中的 Fn、FnMut 和 FnOnce Trait
Rust中的关联类型
tokio
为什么 Tokio 需要自己的sync::Mutex,而不能直接用标准库的std::sync::Mutex?
标准库的std::sync::Mutex是为同步场景设计的,其lock方法会阻塞当前线程直到获取锁。在异步任务中使用时,若锁被长时间持有,会阻塞 Tokio 的工作线程,导致其他任务无法执行,破坏异步效率。
Tokio 的sync::Mutex是异步感知的:
- 其
lock方法返回Future,调用时会await,若锁被占用,任务会让出线程,允许其他任务运行; - 避免了线程阻塞,更适合异步环境中的共享状态管理。
join!
并发运行多个异步任务(Future),等待所有任务完成后,收集它们的结果。
select!
作用:同时等待多个异步任务,当其中第一个任务完成时,执行对应的分支逻辑(其他未完成的任务会被取消)。
用途:处理 “抢占式” 场景,如 “超时控制”“多源数据竞争” 等。