Skip to content
New issue

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

关于对内部可变性类型的理解 #8

Open
bdbai opened this issue Jul 28, 2022 · 0 comments
Open

关于对内部可变性类型的理解 #8

bdbai opened this issue Jul 28, 2022 · 0 comments

Comments

@bdbai
Copy link

bdbai commented Jul 28, 2022

07-内部可变性类型 一节中提到:

内部可变性的基础是Borrow trait

首先 Borrow trait 的用途和内部可变性并没有直接关联,这个 trait 提供的功能更像是一个类型转换。就像文档的 Example 章节提到的,一个典型例子是 HashMap::get 函数让内部存储的值类型和传入的借用类型产生关联。RefCell::borrow 函数虽然和 Borrow::borrow 命名有些类似,但仔细观察可以发现 RefCell::borrowRefCell 本身的实现,而不是 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。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant