Rust面试笔记

220 阅读3分钟

Rust基础

juejin.cn/column/7220…

course.rs/first-try/i…

huangjj27.github.io/interview.h…

生命周期

course.rs/advance/lif…

智能指针

juejin.cn/post/722376…

course.rs/advance/sma…

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() 将 OptionResult 中的值转换为其引用类型 &T 或 Option<&T>

.as_mut() 将 OptionResult 中的值转换为其可变引用类型 &mut T 或 Option<&mut T>

.as_deref() 将 OptionResult 中的值转换为其引用类型 &U,其中 U 实现了 Deref<Target = T>,
这个方法主要用于处理 Box<str> 或 String 等需要字符串切片 &str 的场景

.as_deref_mut() 将 OptionResult 中的值转换为其可变引用类型 &mut U,其中 U 实现了 DerefMut<Target = T>,
这个方法主要用于处理 Box<str> 或 String 等需要可变字符串切片 &mut str 的场景

juejin.cn/post/722376…

course.rs/advance/mac…

Send 和 Sync

juejin.cn/post/725806…

juejin.cn/post/725806…

course.rs/advance/con…

Pin 和 Unpin

juejin.cn/post/725819…

course.rs/advance/asy…

Rust 中的 FnFnMutFnOnce Trait

juejin.cn/post/747482…

Rust中的关联类型

juejin.cn/post/722896…

tokio

为什么 Tokio 需要自己的sync::Mutex,而不能直接用标准库的std::sync::Mutex

标准库的std::sync::Mutex是为同步场景设计的,其lock方法会阻塞当前线程直到获取锁。在异步任务中使用时,若锁被长时间持有,会阻塞 Tokio 的工作线程,导致其他任务无法执行,破坏异步效率。

Tokio 的sync::Mutex异步感知的

  • lock方法返回Future,调用时会await,若锁被占用,任务会让出线程,允许其他任务运行;
  • 避免了线程阻塞,更适合异步环境中的共享状态管理。

join!

并发运行多个异步任务(Future),等待所有任务完成后,收集它们的结果。

select!

作用:同时等待多个异步任务,当其中第一个任务完成时,执行对应的分支逻辑(其他未完成的任务会被取消)。

用途:处理 “抢占式” 场景,如 “超时控制”“多源数据竞争” 等。