什么Box<Fn() + Send + 'static>
在生锈中意味着什么?
我在阅读高级类型章节时偶然发现了这种语法。 Send
是一个特征,但是+
在类型参数化中对于特征(在这种情况下是'static
)的生命是什么意思?还有什么是Fn()
?
让我们一个一个地分解它。
Box<T>
是指向堆分配的T
的指针。我们在这里使用它,因为trait对象只能存在于指针后面。
在Box<Fn() + Send + 'static>
,Fn() + Send + 'static
是trait object类型。将来,written Box<dyn (Fn() + Send + 'static)>
将避免混淆。
dyn
内部是对原始类型的限制。只有当Box<T>
时,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,它can be specified as the second bounds的dyn
类型(特质对象类型)。
'static
bound实际上,dyn
类型(特征对象类型)必须只有一个生命周期绑定。省略时推断出它。推理规则在RFC 0192和RFC 1156中描述。它基本上如下:
Box<Any>
是Box<Any + 'static>
,因为Any: 'static
。&'a Fn()
是&'a (Fn() + 'a)
。'static
(用于函数签名)或匿名生命周期(对于函数体)。f: Box<Fn() + Send + 'static>
是一个拥有指向可调用值的指针(原始类型未知且动态更改),例如闭包(没有参数或没有返回值),它可以跨线程发送,并且与程序本身一样长。