Skip to content

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

@bdbai

Description

@bdbai

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。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions