考虑这些结构:
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可以正常工作。
答案 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
?
'static
Send
表示对象没有引用当前堆栈因此,Send
意味着对象的生命周期界限为'static
,这是微不足道的。
但是...
实际上有一些安全的方法可以引用另一个堆栈的引用,例如在fork-join并行性中,被引用的线程确保它比借用引用的线程更长。它是touched on here,似乎需要与Send
不同的类型来精确指定如何安全地共享数据。