Rust:为什么 Pin 必须持有指针?

Juj*_*mba 6 rust

我已经彻底阅读了 Pin 的文档和一些相关文章。我对 Pin 没有任何疑问,也不知道它为什么重要。除了一个:为什么 Pin 必须持有指针?为什么它不能直接保存数据(例如拥有它)?

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

Frx*_*rem 3

Rust 中的每种类型都是可移动的,因此如果变量中有该类型的值并且没有活动借用,则始终可以将其移动到不同的位置。

整个要点Pin是,它引用的数据被“固定”到特定位置,使得该值不可移动(除非固定类型实现Unpin)。然而,Pin它本身是一种可移动的类型,就像任何其他类型一样,因此只要不借用它就可以自由移动它。

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

因此,Pin无法正确包含固定数据,并且它只能与不围绕所指向的数据移动的指针类型一起使用,特别是当指针本身移动时(包括标准指针类型,如&T&mut TBox<T>Rc<T>, ETC。)。

  • @ChayimFriedman 当然,这在技术上是正确的,但我认为这样的假设类型是完全无用的,因为即使触及“PinOwned”的每一段代码都会确保不移动它或冒 UB 的风险,这消除了拥有安全的全部意义无论如何,API 都可以处理固定值。在“Pin”实际上是什么的背景下,即用于固定值的安全 API,我认为我的答案是合适的。 (3认同)