我无法找到!Unpin
的文档 在这里的文档中提到。
更普遍地说,!
运算符似乎缺乏有关特性的相应文档。具体而言,它似乎表示Not
,例如在这种情况下是Not Unpin
或者可能是Not Unpinable
。我想它与Pin
在某些方面不同,否则它将是多余的。目前,由于!
经常出现,因此查找文档很具有挑战性。
如果可以在文档的附录B:运算符和符号中包含!
在特性上的操作行为,那就太好了。
我无法找到!Unpin
的文档 在这里的文档中提到。
更普遍地说,!
运算符似乎缺乏有关特性的相应文档。具体而言,它似乎表示Not
,例如在这种情况下是Not Unpin
或者可能是Not Unpinable
。我想它与Pin
在某些方面不同,否则它将是多余的。目前,由于!
经常出现,因此查找文档很具有挑战性。
如果可以在文档的附录B:运算符和符号中包含!
在特性上的操作行为,那就太好了。
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
则相反,它表示“我知道我们刚刚固定了这个值,但作为此类型的编写者,我知道它仍然可以安全地移动”。Unpin
的。唯一需要将某些东西标记为!Unpin
的时候是当它与其他语言(如C)进行交互时。例如,如果您有一个在C中存储指针的数据类型,则C代码可能根据数据永远不会更改地址的假设来编写。在这种情况下,您需要取消Unpin
的实现。Unpin
表示可以“安全”移动,而 !Unpin
表示不安全移动。然而,结构体 Pin<T>
表示在任何情况下都“不会”被移动。最后,!
取消隐式特质,如 Unpin
。这样对吗? - GeorgePin
,并且使其为!Unpin
。如果某些内容不在Pin
内,则可以随时移动。如果某些内容实现了Unpin
,则即使在Pin
内部也可以移动。 - Silvio MayoloPin
中的对象是无法移动的。但是,Unpin
指定了您可以使用 Pin::into_inner()
将对象转换回可移动变体。这将消耗 Pin
。 - Finomnis