我已经彻底阅读了Pin的文档和几篇关于它的文章.我没有关于Pin的问题,为什么这很重要.除了一个:为什么Pin必须拿着指针?为什么它不能直接保留数据(例如拥有它)?

也许,这样的决定是因为Pin只在编译时存在?

推荐答案

Rust中的每一种类型都是平凡可移动的,所以如果变量中有该类型的值,并且没有活动的borrow ,则始终可以将其移动到不同的位置.

Pin的全部意义在于,它引用的数据被"固定"到一个特定位置,使得该值不可移动(除非固定的类型实现Unpin).不过,Pin本身就是一个活字,就像其他任何类型一样,所以只要不是借来的,你就可以自由地移动.

如果Pin直接包含固定的数据而不是使用引用,会发生什么情况?然后,移动Pin也会移动它的所有字段,包括它包含的固定数据,这显然会打破该类型的固定保证.

正因为如此,Pin不能正确地包含固定的数据,并且它只能与不在所指向的数据周围移动的指针类型一起工作,特别是当指针本身被移动时(包括标准指针类型,如&T&mut TBox<T>Rc<T>等).

Rust相关问答推荐

移植带有可变borrow 的C代码-卸载期间错误(nappgui示例)

为什么拥有的trait对象的相等运算符移动了正确的操作数?

无法将记录器向下转换回原始 struct

如何在递归数据 struct 中移动所有权时变异引用?

Rust 的多态现象.AsRef与Derf

如果死 struct 实现了/派生了一些特征,为什么Rust会停止检测它们?

在Rust中判断编译时是否无法访问

如何将单个 struct 实例与插入器一起传递到Rust中的映射

RUST 中的读写器锁定模式

如何强制匹配的返回类型为()?

如何在 Rust 中编写一个通用方法,它可以接受任何可以转换为另一个值的值?

Rust 1.70 中未找到 Trait 实现

中文优化标题:跳出特定循环并返回一个值

Rust中的一生语法有什么作用?

str 和 String 的 Rust 生命周期

我如何取消转义,在 Rust 中多次转义的字符串?

如何在 Rust 中创建最后一个元素是可变长度数组的 struct ?

有没有更好的方法来为拥有 DIsplay 事物集合的 struct 实现 Display?

为什么 std::iter::Peekable::peek 可变地borrow self 参数?

为什么我不能将元素写入 Rust 数组中移动的位置,但我可以在元组中完成