Box<Fn() + Send + 'static>
在 rust 迹中意味着什么?
在阅读高级类型一章时,我偶然发现了这种语法.Send
是一个特征,但在类型参数化中,+
对一个特征(本例中为'static
)意味着什么?Fn()
是什么?
Box<Fn() + Send + 'static>
在 rust 迹中意味着什么?
在阅读高级类型一章时,我偶然发现了这种语法.Send
是一个特征,但在类型参数化中,+
对一个特征(本例中为'static
)意味着什么?Fn()
是什么?
让我们一个一个地分解它.
Box<T>
是指向堆分配T
的指针.我们在这里使用它是因为trait对象只能存在于指针后面.
在Box<Fn() + Send + 'static>
中,Fn() + Send + 'static
是trait object型.为了避免混淆,future 将是written Box<dyn (Fn() + Send + 'static)>
.
dyn
以内是对原始类型的限制.101 can be coerced into 102 only when 103.因此,虽然我们不知道原始类型,但我们可以假设它是Fn()
、Send
和had 106 lifetime.
Fn()
这是一种trait ,就像Clone
或Default
.但是,它使用了一个特殊的syntax sugar.
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
种类型(trait 对象类型)中的can be specified as the second bounds种.
'static
bound实际上是102 types (trait object types) must have exactly one lifetime bound.省略时就可以推断出来.推理规则如RFC 0192和RFC 1156所述.基本上是这样的:
Box<Any>
是Box<Any + 'static>
,因为Any: 'static
.&'a Fn()
等于&'a (Fn() + 'a)
.'static
(对于函数签名)或匿名生存期(对于函数体).f: Box<Fn() + Send + 'static>
是一个指向可调用值(原始类型未知且动态更改)的自有指针,例如闭包(无参数或无返回值),它可以跨线程发送,只要程序本身有效.
未被发送