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

在阅读高级类型一章时,我偶然发现了这种语法.Send是一个特征,但在类型参数化中,+对一个特征(本例中为'static)意味着什么?Fn()是什么?

推荐答案

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

Box

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

Trait objects

Box<Fn() + Send + 'static>中,Fn() + Send + 'statictrait object型.为了避免混淆,future 将是written Box<dyn (Fn() + Send + 'static)>.

dyn以内是对原始类型的限制.101 can be coerced into 102 only when 103.因此,虽然我们不知道原始类型,但我们可以假设它是Fn()Sendhad 106 lifetime.

Fn()

这是一种trait ,就像CloneDefault.但是,它使用了一个特殊的syntax sugar.

  • 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,所以它是dyn种类型(trait 对象类型)中的can be specified as the second bounds种.

'static bound

实际上是102 types (trait object types) must have exactly one lifetime bound.省略时就可以推断出来.推理规则如RFC 0192RFC 1156所述.基本上是这样的:

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

Conclusion

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

Rust相关问答推荐

是否可以为`T:Copy`执行`T. clone`的测试

如何装箱生命周期相关联的两个对象?

返回的future 不是`发送`

在自定义序列化程序中复制serde(With)的行为

如何为rust trait边界指定多种可能性

为什么铁 rust S的默认排序功能比我对小数组的 Select 排序稍微慢一些?

从未排序的链表中删除重复项的铁 rust 代码在ELSE分支的低级上做了什么?

根据填充系数以相对大小在给定空间中布局项目

如何迭代属性以判断相等性?

如何将 struct 数组放置在另一个 struct 的末尾而不进行内存分段

更新 rust ndarray 中矩阵的一行

在 Rust 中实现资源消耗的安全包装器

如何将这些测试放在一个单独的文件中?

如何将 Rust 中的树状 struct 展平为 Vec<&mut ...>?

Rust 异步和 AsRef 未被发送

试图理解 Rust 中的可变闭包

TcpStream::connect - 匹配武器具有不兼容的类型

有没有办法在 Rust 中对 BigInt 进行正确的位移?

如何用另一个变量向量置换 rust simd 向量?

Rust 生命周期:不能在方法内重新borrow 可变字段