2014-11-06 40 views
3

考虑以下结构:发送和静态封闭锈的区别是什么?

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>, 
} 

有形,它们之间有什么区别呢?

什么是'发送'作为绑定,以及为什么当提供发送时,我不再需要提供一生? Send正在生成的隐式生命周期是什么?

具体来说,Send和'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与'静态'分别。

回答

3

Send是“种” http://doc.rust-lang.org/reference.html#built-in-traits

send : Able to be sent across task boundaries.

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

参考还包含Send另一照明部分:(我们没有为基准得到最佳布局尚)http://doc.rust-lang.org/reference.html#type-kinds

Send : Types of this kind can be safely sent between tasks. This kind includes scalars, boxes, procs, and structural types containing only other owned types. All Send types are 'static.

所以这就是为什么你可以在某些情况下可以互换使用。

2

Why are we talking about a lifetime?

闭包嵌入一个环境,该环境可能包含或不包含对当前线程堆栈的引用。这个环境有一个生命周期界限,它表示它可以生存的最长持续时间,并且对应于任何嵌入式参考的最短生命周期,您可以用适当的表示法指示它。

  • 如果它包含当前线程堆栈的引用,则封闭的使用寿命不应超过寿命所述参考
  • 如果它包含静态资源的引用,而不是挂线程堆栈从而,然后封闭件的寿命并不限于

'static是上界,因为它提供了没有限制,并且因此'static用于指示不存在任何寿命的约束。它巧妙地避免了一个特殊情况:总是存在一生的界限,只是有时它是“无限的”。

What does Send mean?

Send种类被施加到对象,以指示其可以经由信道安全地发送到另一个线程,例如。因此,它意味着所述对象不会引用当前线程堆栈,否则如果堆栈解开对象将包含悬挂引用!

Why does Send seem to imply 'static ?

  1. 如果对象没有参考当前堆栈,其寿命绑定是'static
  2. Send意味着一个对象没有参考当前堆栈

它是微不足道的,因此,Send意味着对象的使用期限为'static

But...

其实有安全的方式来引用另一组的参考,例如在的fork-join并行,其中线程被称为保证它会超越线程借用引用。它是touched on here,似乎需要与Send不同的种类来精确指定数据如何安全共享。

+0

你能解释一下''static'在所有权模型和释放内存方面的工作原理吗?我无法包装我的头,这意味着将参数传递给声明了静态生命周期的函数。通过的项目是否必须在程序的整个生命周期中生活?这是一种内存泄漏吗? – jocull 2015-06-11 05:10:41

+0

经过一番实验,我*认为*我明白了...... http://is.gd/8KWutk“静态”意味着给定的特质是静态的 - 不是传入的项目!这更有意义。 – jocull 2015-06-11 05:28:40

+0

@jocull:''static'意思是“程序的生命周期”。 (1)'&'static T'意味着这个'T'的实例必须和程序一样长,它可以通过泄漏它(humpf ...)来实现,或者仅仅因为它是一个“静态”常量。 (2)'特性+'静态'意味着该项目不应该包含一个小于''静态'的生命周期的引用,它可以通过只包含'&'静态T'或不包含任何引用来实现。 – 2015-06-11 06:22:06

相关问题