Box<Fn() + Send + 'static>
在生锈中意味着什么?
在阅读高级类型章节时,我偶然发现了这种语法。 Send
是一个特征,但在类型参数化中+
对于特征(在这种情况下为'static
)的生命周期是什么意思?什么是Fn()
?
答案 0 :(得分:14)
让我们一个一个地分解它。
Box<T>
是指向堆分配T
的指针。我们在这里使用它,因为trait对象只能存在于指针后面。
在Box<Fn() + Send + 'static>
中,Fn() + Send + 'static
是trait object类型。将来,written Box<dyn (Fn() + Send + 'static)>
将避免混淆。
内部dyn
是对原始类型的限制。仅当Box<T>
时,才能将{strong> Box<Fn() + Send + 'static>
强制转换为T: Fn() + Send + 'static
。因此,虽然我们不知道原始类型,但我们可以假设它是Fn()
和Send
而的生命期为'static
。
Fn()
这是一个特征,就像Clone
或Default
一样。但是,它使用特殊的语法糖。
Fn(A1, ..., An)
是Fn<(A1, ..., An), Output=()>
的语法糖。Fn(A1, ..., An) -> R
是Fn<(A1, ..., An), Output=R>
的语法糖。Fn
,FnMut
,FnOnce
和FnBox
。那么Fn
意味着什么? T: Fn(A1, ..., An) -> R
表示x: T
是一个可调用的对象,其参数为A1, ..., An
,返回类型为R
。示例包括函数指针和闭包。
Send
表示可以跨线程发送此类型的值。由于这是auto trait,因此dyn
类型'static
类型(特征对象类型)。
dyn
绑定实际上, Box<Any>
类型(特征对象类型)必须只有一个生命周期约束。省略时推断出它。推理规则在can be specified as the second bounds和RFC 0192中有所描述。它基本上如下:
Box<Any + 'static>
为&'a Fn()
,因为RFC 1156。&'a (Fn() + 'a)
为'static
。f: Box<Fn() + Send + 'static>
(对于函数签名)或匿名生存期(对于函数体)。 select *from table_name where id in (your_array) and name = 'red';
是一个拥有指向可调用值的指针(原始类型未知且动态更改),例如闭包(没有参数或没有返回值),它可以跨线程发送,并且只要有效程序本身。
答案 1 :(得分:0)
我发现 'static
部分需要 the top-voted answer 进行更多阐述。
将底层混凝土类型表示为A
。
特征对象 Box<dyn Fn() + Send + 'static>
可以从 A
的实例构造,这意味着 A: Fn() + Send + 'static
。也就是说,具体类型A
受static
生命周期的限制。
将 'static
的特定 explanation 作为特征边界:
作为 trait bound,意味着类型不包含任何非静态引用。例如。接收者可以根据需要保留该类型,并且在他们丢弃它之前它永远不会失效。
重要的是要理解这意味着任何拥有的数据总是通过 'static
生命周期限制,但对该拥有数据的引用通常不会
generative explanation 用于将任何生命周期用作特征边界的情况:
<块引用>T: 'a 意味着 T 的所有生命周期参数都比 'a。例如,如果 'a 是一个不受约束的生命周期参数,那么 i32: 'static 和 &'static str: 'a 是满足的,但 Vec<&'a ()>: 'static 不是。
例如,在我们的例子中,A
的所有生命周期参数都必须比 'static
存活时间更长
pub struct A<'a> {
buf: &'a[u8]
}
无法满足 A: 'static
要求。