发送和'静态封闭生锈有什么区别?

时间:2014-11-06 14:48:40

标签: rust

考虑这些结构:

struct Promise1<T, Err> {
    on_resolve:Option<|promised:T|: Send>,
    on_reject:Option<|failed:Err|: Send>,
}

struct Promise2<T, Err> {
    on_resolve:Option<|promised:T|: 'static>,
    on_reject:Option<|failed:Err|: 'static>,
}

struct Promise3<'a, T, Err> {
    on_resolve:Option<|promised:T|: 'a>,
    on_reject:Option<|failed:Err|: 'a>,
}

明显地,他们之间有什么区别?

什么是发送&#39;作为一个约束,为什么在提供发送时,我是否不再需要提供一生? Send正在生成的隐式生命周期是什么?

具体来说,Send和&#39; static作为闭包边界有什么区别。

例如,这有效:

let k:|int|:Send = |i:int| {};
let p:|int|:Send = |i:int| {};
Promise1 {
    on_resolve:Some(k),
    on_reject:Some(p)
};

但这不是:

let k = |i:int| {};
let p = |i:int| {};
Promise1 {
    on_resolve:Some(k),
    on_reject:Some(p)
};

错误:

error: mismatched types: expected `core::option::Option<'static |_|:Send>`, found 
`core::option::Option<|int|>` (expected bounds `Send`, found no bounds)

...但是,使用Promise2或Promise3分别使用&#39; static和&#39; a可以正常工作。

2 个答案:

答案 0 :(得分:3)

Send是一种&#39;类型的&#39; http://doc.rust-lang.org/reference.html#built-in-traits

  

发送:能够跨任务边界发送。

'static是一个特殊的生命周期:一生持续整个程序。

该引用还包含Send上的另一个启发部分:(我们尚未获得参考的最佳布局)http://doc.rust-lang.org/reference.html#type-kinds

  

发送:可以在任务之间安全地发送此类类型。这种类型包括标量,框,过程和仅包含其他所有类型的结构类型。所有发送类型都是静态的。

这就是为什么你可以在某些情况下互换使用它们的原因。

答案 1 :(得分:2)

  

为什么我们要谈论一生?

闭包嵌入了一个环境,该环境可能包含也可能不包含对当前线程堆栈的引用。此环境具有生存期限,表示可行的最大持续时间,并且对应于任何嵌入式引用的最短生存期,您使用适当的表示法指示。

  • 如果它包含对当前线程堆栈的引用,那么闭包的生命周期不应超过所述引用的生命周期
  • 如果它包含对静态资源的引用,并且因此没有链接到线程堆栈,那么闭包的生命周期不受限制

'static是上限,因为它没有给出限制,因此'static用于表示没有任何生命周期约束。它巧妙地避免了一个特殊的情况:总有一个生命束缚,只是有时候它会无限的#34;

  

Send是什么意思?

Send种类应用于对象,以指示可以安全地将其发送到另一个线程,例如通过通道。因此,它暗示所述对象不引用当前线程堆栈,否则如果堆栈展开,对象将包含悬空引用!

  

为什么Send似乎暗示'static

  1. 如果对象没有引用当前堆栈,则其生存期限为'static
  2. Send表示对象没有引用当前堆栈
  3. 因此,Send意味着对象的生命周期界限为'static,这是微不足道的。

      

    但是...

    实际上有一些安全的方法可以引用另一个堆栈的引用,例如在fork-join并行性中,被引用的线程确保它比借用引用的线程更长。它是touched on here,似乎需要与Send不同的类型来精确指定如何安全地共享数据。