什么“Box <fn()+ =”“send =”“+ =”“'static =”“>”是生锈的意思吗?

时间:2017-12-29 04:10:39

标签: types rust traits lifetime lifetime-scoping

Box<Fn() + Send + 'static>在生锈中意味着什么?

在阅读高级类型章节时,我偶然发现了这种语法。 Send是一个特征,但在类型参数化中+对于特征(在这种情况下为'static)的生命周期是什么意思?什么是Fn()

2 个答案:

答案 0 :(得分:14)

让我们一个一个地分解它。

Box<T>是指向堆分配T的指针。我们在这里使用它,因为trait对象只能存在于指针后面。

特质对象

Box<Fn() + Send + 'static>中,Fn() + Send + 'statictrait object类型。将来,written Box<dyn (Fn() + Send + 'static)>将避免混淆。

内部dyn是对原始类型的限制。仅当Box<T> 时,才能将{strong> Box<Fn() + Send + 'static>强制转换为T: Fn() + Send + 'static。因此,虽然我们不知道原始类型,但我们可以假设它是Fn()Send的生命期为'static

Fn()

这是一个特征,就像CloneDefault一样。但是,它使用特殊的语法糖

  • Fn(A1, ..., An)Fn<(A1, ..., An), Output=()>的语法糖。
  • Fn(A1, ..., An) -> RFn<(A1, ..., An), Output=R>的语法糖。
  • 此语法糖也适用于以下特征:FnFnMutFnOnceFnBox

那么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 boundsRFC 0192中有所描述。它基本上如下:

  1. 如果明确给出,请使用该生命周期。
  2. 否则,从内在特征推断。例如,Box<Any + 'static>&'a Fn(),因为RFC 1156
  3. 如果特征没有适当的生命周期,则从外部类型推断。例如,&'a (Fn() + 'a)'static
  4. 如果甚至失败了,它会回退到f: Box<Fn() + Send + 'static>(对于函数签名)或匿名生存期(对于函数体)。
  5. 结论

    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。也就是说,具体类型Astatic生命周期的限制。

'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 要求。