什么是“盒子 “生锈意味着什么?

问题描述 投票:8回答:1

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

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

types rust traits lifetime lifetime-scoping
1个回答
14
投票

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

Box

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

Trait objects

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

dyn内部是对原始类型的限制。只有当Box<T>时,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

Send意味着可以跨线程发送此类型的值。由于这是一个auto trait,它can be specified as the second boundsdyn类型(特质对象类型)。

'static bound

实际上,dyn类型(特征对象类型)必须只有一个生命周期绑定。省略时推断出它。推理规则在RFC 0192RFC 1156中描述。它基本上如下:

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

Conclusion

f: Box<Fn() + Send + 'static>是一个拥有指向可调用值的指针(原始类型未知且动态更改),例如闭包(没有参数或没有返回值),它可以跨线程发送,并且与程序本身一样长。

© www.soinside.com 2019 - 2024. All rights reserved.