Rust Send和'之间有什么区别;静电对铁锈封闭?
考虑以下结构:Rust Send和'之间有什么区别;静电对铁锈封闭?,rust,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<|f
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>,
}
但这并不是:
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)
错误:不匹配的类型:预期的'core::option::optionSend
为'kind'
发送:能够跨任务边界发送
'static
是一个特殊的生命周期:一个持续整个程序的生命周期
参考还包含另一个关于发送的说明部分:(我们还没有得到参考的最佳布局)
发送:此类类型可以在任务之间安全地发送。这种类型包括标量、框、过程和只包含其他拥有类型的结构类型。所有发送类型都是“静态”
这就是为什么在某些情况下可以互换使用它们的原因
我们为什么要谈论一生
闭包嵌入一个环境,该环境可能包含或不包含对当前线程堆栈的引用。此环境有一个生存期界限,它指示其可行的最大持续时间,并对应于任何嵌入引用的最短生存期,您可以用适当的符号表示
- 如果它包含对当前线程堆栈的引用,则闭包的生存期不应超过所述引用的生存期
- 如果它包含对静态资源的引用,并且因此未链接到线程堆栈,则闭包的生存期不受限制
'static
是上限,因为它不提供任何限制,因此'static
用于指示不存在任何生存期约束。它巧妙地避免了一种特殊情况:总是有一个生命的界限,只是有时候它是“无限的”
Send
是什么意思
Send
类应用于对象,以指示它可以安全地发送到另一个线程,例如通过通道。因此,这意味着所述对象不携带对当前线程堆栈的引用,否则如果堆栈展开,该对象将包含悬空引用
为什么发送
似乎意味着是静态的
如果对象没有对当前堆栈的引用,则其生存期界限为静态
Send
表示对象没有对当前堆栈的引用
因此,Send
意味着对象的生命周期界限是静态的,这是很平常的
但是
实际上有安全的方法引用另一个堆栈的引用,例如在fork-join并行中,被引用的线程确保它比借用引用的线程更长寿。它是,而且似乎需要不同于Send
的类型来精确地指定如何安全地共享数据。您能解释一下'static
在所有权模型和释放内存方面是如何工作的吗?我很难理解将参数传递到声明了静态生存期的函数中意味着什么。传入的项目是否必须在程序的生命周期内有效?这是一种内存泄漏吗?经过一些实验,我想我明白了'static
表示给定的特征是静态的——而不是传入的项!这更有意义。@jocull:“static
表示“程序的生命周期”。(1) &'static T
意味着T
的这个实例必须和程序一样长,它可以通过泄漏它(humpf…)或者仅仅因为它是一个静态
常量来实现。(2) Trait+'static
表示该项不应包含生存期小于'static
的引用,可以通过仅包含&'static T
或不包含任何引用来实现。
error: mismatched types: expected `core::option::Option<'static |_|:Send>`, found
`core::option::Option<|int|>` (expected bounds `Send`, found no bounds)