我可以定义一个特征,其实现都必须是`!Send`?(Can I define a trait who

2019-09-30 00:36发布

我想确定这迫使其执行者在任何情况下被发送到,或之间,线程共享一个特点。 它应该足以标记性状如!Send ,但锈似乎并没有让我。

可能吗?

实施例( 运动场 ):

#![feature(optin_builtin_traits)]

// This is a syntax error
//trait ThreadThing : !Send {}

// This doesn't work either
trait ThreadThing { }
impl !Send for ThreadThing {}

Answer 1:

不,你不能让!Send的条件ThreadThing 。 编译器只是不支持那种逻辑。

如果会有人使用您的箱子做一个类型中隐含有可能Send包含在其执行没有不安全的代码的任何地方,并使其不安全只是通过实施ThreadThing它-在这种情况下,你会作出ThreadThingunsafe trait ,表明有不安全的代码的地方,依赖于无法在类型系统描述不变:不变“的东西,是Send没有实现ThreadThing ”。

如果像更有可能,这只是不安全实现Send手动实现一种ThreadThing -在这种情况下,你不需要做任何事情,因为手动执行Send是不安全的已经 。 如果实现者ThreadThing决定手动执行Send ,他们承担,不仅保证自己不变,但也负担ThreadThing的。



Answer 2:

答案是:是的,你可以,一些非常具体的条件下。 你是否应该需要做的,这是另一回事。

如果你是否定的特点是可以定义为另一个性状的负面特质的实现:

  • 自动特质。
  • 从目前的箱子。

所以,下面的工作( 操场 ):

#![feature(optin_builtin_traits)]

auto trait Scary {}

trait ThreadThing { }
impl !Scary for ThreadThing {}

但是,如果你试图做它不会工作:

impl !Send for ThreadThing {}

或者,如果Scary是没有自动特质。

然而需要注意的是,一般它不应该是必要的标记性状!Send这种方式。 性状的具体实施方案将被标记Send!Send通过基于实现结构的内容锈编译器。



文章来源: Can I define a trait whose implementations must be `!Send`?