感叹号在特征实现中意味着什么?
What does the exclamation point mean in a trait implementation?
我在图书馆参考中找到 std::rc::Rc
this trait implementation
impl<T> !Send for Rc<T>
where
T: ?Sized,
Send
前面的感叹号是什么意思?
我咨询了两个 The Rust Programming Language¹ book and The Rust Reference²,但没有找到解释。请在您的回答中给出参考。
¹ 尤其是[部分3.19 Traits
²和章节5.1 Traits and 5.1 Implementations
这是 negative trait impl,因此您可以将其解读为选择退出 Send
特征。
这是 RFC 19 中描述的 负面特征实施 Send
特征。
总结一下:Send
trait 是一个 auto trait,这意味着它会自动为仅包含其他 Send
类型的所有类型实现:
unsafe auto trait Send {}
(Send
也是一个 不安全特征 ,这意味着实施起来不安全,但这与问题无关。)
一个auto
特征可能不定义任何方法,这也使它成为一个标记特征。 (定义 auto traits 的语法目前仅在标准库或 nightly 编译器中可用,但它们的语义是稳定的。)
要选择退出 Send
的自动实现,您必须编写一个明确的负面特征实现:
impl !Send for MyType {}
这意味着即使MyType
仅包含其他类型Send
,MyType
本身也不会自动实现Send
。
另见另一个问题的答案:
我在图书馆参考中找到 std::rc::Rc
this trait implementation
impl<T> !Send for Rc<T>
where
T: ?Sized,
Send
前面的感叹号是什么意思?
我咨询了两个 The Rust Programming Language¹ book and The Rust Reference²,但没有找到解释。请在您的回答中给出参考。
¹ 尤其是[部分3.19 Traits
²和章节5.1 Traits and 5.1 Implementations
这是 negative trait impl,因此您可以将其解读为选择退出 Send
特征。
这是 RFC 19 中描述的 负面特征实施 Send
特征。
总结一下:Send
trait 是一个 auto trait,这意味着它会自动为仅包含其他 Send
类型的所有类型实现:
unsafe auto trait Send {}
(Send
也是一个 不安全特征 ,这意味着实施起来不安全,但这与问题无关。)
一个auto
特征可能不定义任何方法,这也使它成为一个标记特征。 (定义 auto traits 的语法目前仅在标准库或 nightly 编译器中可用,但它们的语义是稳定的。)
要选择退出 Send
的自动实现,您必须编写一个明确的负面特征实现:
impl !Send for MyType {}
这意味着即使MyType
仅包含其他类型Send
,MyType
本身也不会自动实现Send
。
另见另一个问题的答案: