考虑以下结构体:
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'时就不再需要提供生命周期?这个隐含的生命周期是由'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 与 'static 和 'a 相应地一起使用时,这个问题可以很好地解决。
'static
在所有权模型和释放内存方面的工作原理吗?我很难理解将具有静态生命周期声明的参数传递到函数中意味着什么。传入的项目是否必须在程序的整个生命周期内存在?这是一种内存泄漏吗? - jocull'static
表示给定的 Trait 是静态的 -- 而不是传递进来的项目!这更有意义。 - jocull'static
的意思是“程序的生命周期”。(1)&'static T
表示T
的实例必须与程序一样长寿,可以通过泄漏它(呃...)或者只是因为它是一个static
常量来实现。(2)Trait + 'static
表示该项不应包含寿命小于'static
的引用,可以通过仅包含&'static T
或不包含任何引用来实现。 - Matthieu M.