在Rust中,!Unpin是什么?

3

我无法找到!Unpin的文档 在这里的文档中提到

更普遍地说,!运算符似乎缺乏有关特性的相应文档。具体而言,它似乎表示Not,例如在这种情况下是Not Unpin或者可能是Not Unpinable。我想它与Pin在某些方面不同,否则它将是多余的。目前,由于!经常出现,因此查找文档很具有挑战性。

如果可以在文档的附录B:运算符和符号中包含!在特性上的操作行为,那就太好了。


2
这是一个自动特质的负实现。文档在这里:https://doc.rust-lang.org/stable/reference/special-types-and-traits.html#auto-traits - Sven Marnach
我承认如果不知道“自动特质”这个术语的话,很难找到它。 - Sven Marnach
另一方面,如果您不知道自动特征,则可能没有太大用处。@SvenMarnach - jthulhu
1个回答

1
Unpin是几个自动特性之一,它会自动为与其兼容的任何类型进行实现。对于Unpin,这意味着基本上所有类型都适用,详见此处

只有自动特性(而且仅限于自动特性)可以通过在特性名前加上!来编写负实现。

// By default, A implements Unpin
struct A {}

// But wait! Don't do that! I know something you don't, compiler.
impl !Unpin for A {}
Unpin指的是告诉Rust,实现类型T的值可以安全地从Pin中移动。通常情况下,Pin表示内部的内容不应该被移动。而Unpin则相反,它表示“我知道我们刚刚固定了这个值,但作为此类型的编写者,我知道它仍然可以安全地移动”。
通常,在Safe Rust中的任何内容都是Unpin的。唯一需要将某些东西标记为!Unpin的时候是当它与其他语言(如C)进行交互时。例如,如果您有一个在C中存储指针的数据类型,则C代码可能根据数据永远不会更改地址的假设来编写。在这种情况下,您需要取消Unpin的实现。

因此,特质 Unpin 表示可以“安全”移动,而 !Unpin 表示不安全移动。然而,结构体 Pin<T> 表示在任何情况下都“不会”被移动。最后,! 取消隐式特质,如 Unpin。这样对吗? - George
在Rust中标记某些内容为“不安全移动”的唯一方法是将其Pin,并且使其为!Unpin。如果某些内容不在Pin内,则可以随时移动。如果某些内容实现了Unpin,则即使在Pin内部也可以移动。 - Silvio Mayolo
所有东西都实现了 Unpin 吗?根据文档:几乎每种类型都自动实现了此特征。是不是对于 &mut T 它没有被实现? - George
1
@SilvioMayolo 在 Pin 中的对象是无法移动的。但是,Unpin 指定了您可以使用 Pin::into_inner() 将对象转换回可移动变体。这将消耗 Pin - Finomnis
据我所知,“PhantomPinned”比硬编码的“impl !Unpin”更受欢迎。但也许我错了。 - Finomnis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接