代码之家  ›  专栏  ›  技术社区  ›  Edd Barrett

我可以定义一个trait,它的实现必须是`!发送`?

  •  1
  • Edd Barrett  · 技术社区  · 8 年前

    我想定义一个特性,它强制它的实现者在任何情况下都不能被发送到线程,也不能在线程之间共享。它应该足以将该特征标记为 !Send ,但锈似乎不让我这么做。

    可能吗?

    playground

    #![feature(optin_builtin_traits)]
    
    // This is a syntax error
    //trait ThreadThing : !Send {}
    
    // This doesn't work either
    trait ThreadThing { }
    impl !Send for ThreadThing {}
    
    2 回复  |  直到 8 年前
        1
  •  2
  •   trent oli_obk    8 年前

    不,你做不到 !Send 状态 ThreadThing . 编译器不支持这种逻辑。

    如果有人可能的话 使用 您的板条箱将创建一个隐式 Send ,在任何地方的实现中都不包含不安全代码,并且 实施 线状物 在这种情况下,你会 线状物 unsafe trait 表示某个地方存在不安全代码,该代码依赖于无法在类型系统中描述的不变量:不变量“存在的事物” 邮寄 不执行 线状物

    邮寄 对于实现 线状物 --在这种情况下,你不需要做任何事情,因为 manually implementing Send is unsafe already . 如果 决定手动执行 邮寄 ,他们不仅承担着保证自身不变量的责任,而且还承担着 线状物 是的。

        2
  •  0
  •   Edd Barrett    8 年前

    如果要否定的特质是:

    • 天生的特性。
    • 从当前的板条箱。

    因此,以下方法将起作用( playground ):

    #![feature(optin_builtin_traits)]
    
    auto trait Scary {}
    
    trait ThreadThing { }
    impl !Scary for ThreadThing {}
    

    但是,如果您尝试执行以下操作,则它将不起作用:

    impl !Send for ThreadThing {}
    

    或者如果 Scary

    但是请注意,一般来说,不需要标记一个特征 !Send 就这样。trait的具体实现将被标记 Send !邮寄 由Rust编译器根据实现结构的内容执行。

    推荐文章