We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
在 07-内部可变性类型 一节中提到:
07-内部可变性类型
内部可变性的基础是Borrow trait
首先 Borrow trait 的用途和内部可变性并没有直接关联,这个 trait 提供的功能更像是一个类型转换。就像文档的 Example 章节提到的,一个典型例子是 HashMap::get 函数让内部存储的值类型和传入的借用类型产生关联。RefCell::borrow 函数虽然和 Borrow::borrow 命名有些类似,但仔细观察可以发现 RefCell::borrow 是 RefCell 本身的实现,而不是 Borrow trait 的实现。
Borrow
HashMap::get
RefCell::borrow
Borrow::borrow
RefCell
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。
UnsafeCell
&
&mut
std::mem::transmute
The text was updated successfully, but these errors were encountered:
No branches or pull requests
在
07-内部可变性类型
一节中提到:首先
Borrow
trait 的用途和内部可变性并没有直接关联,这个 trait 提供的功能更像是一个类型转换。就像文档的 Example 章节提到的,一个典型例子是HashMap::get
函数让内部存储的值类型和传入的借用类型产生关联。RefCell::borrow
函数虽然和Borrow::borrow
命名有些类似,但仔细观察可以发现RefCell::borrow
是RefCell
本身的实现,而不是Borrow
trait 的实现。对
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。The text was updated successfully, but these errors were encountered: