-
Notifications
You must be signed in to change notification settings - Fork 217
Open
Description
在 07-内部可变性类型 一节中提到:
内部可变性的基础是Borrow trait
首先 Borrow trait 的用途和内部可变性并没有直接关联,这个 trait 提供的功能更像是一个类型转换。就像文档的 Example 章节提到的,一个典型例子是 HashMap::get 函数让内部存储的值类型和传入的借用类型产生关联。RefCell::borrow 函数虽然和 Borrow::borrow 命名有些类似,但仔细观察可以发现 RefCell::borrow 是 RefCell 本身的实现,而不是 Borrow trait 的实现。
UnsafeCell逃脱RUST对引用安全检查的方法实际上就是个通常的unsafe 的裸指针操作,没有任何神秘性可言。
对 UnsafeCell 以外的任何类型,从 & 得到内部的 &mut 都是 undefined behavior,无论是通过指针转换还是 std::mem::transmute 等方法。UnsafeCell 可以绕过 borrow rules 的假设是因为编译器对它有特殊处理(即开洞),这也是为什么 UnsafeCell 是一个 lang term,见 https://doc.rust-lang.org/src/core/cell.rs.html#1837 。如果用户尝试复刻一个 UnsafeCell,最终也会产生 unsoundness。
Metadata
Metadata
Assignees
Labels
No labels