Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust Send和'之间有什么区别;静电对铁锈封闭?_Rust - Fatal编程技术网

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::option
Send
为'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)