此函数返回闭包.使用impl Fn()作为闭合类型是可以的:

fn foo() -> impl Fn() {
    || ()
}

但这是行不通的:

fn foo<T: Fn()>() -> T {
    || ()
}

也不是这个:

fn foo<T>() -> T
where
    T: Fn(),
{
    || ()
}

为什么最后两个例子不起作用?

推荐答案

在这两个"非工作"的例子中,思考一下为什么T被称为类型parameter可能会有所帮助.

它由函数的调用者决定其参数,类型也是如此.有时它们是显式指定的,有时是推断出来的,但总是由调用者来说明它们是什么,并且实现必须适用于all种可能的类型.这有时被称为universal quantification(在数学中为∀T).

然而,示例cannot中的闭包类型是由调用者提供的,因为它是函数体的实现细节.闭包的类型由函数固定,调用者指定不同的类型是没有意义的.

在您的第一个示例中,它之所以有效,是因为回车位置中的impl Fn()表示正在发生的事情.也就是说,从调用者的Angular 来看,具体类型是未知的,但它由实现唯一确定.这就是众所周知的existentially quantified(在数学上,∃T)--一种我们可以确信存在的类型,尽管我们不一定知道它实际上是什么.

Rust相关问答推荐

为什么是!为Rust中的RwLockReadGuard和RwLockWriteGuard实现的发送特征?

基于对vec值的引用从该值中删除该值

重新导出proc宏导致未解决的extern crate错误""

有没有办法模仿对象安全克隆?

为什么reqwest以文本形式下载二进制文件?

在Rust中,如果Result是Err,运行副作用(如日志(log)记录)的惯用方法是什么

如何编写一个以一个闭包为参数的函数,该函数以另一个闭包为参数?

可以为rust构建脚本编写单元测试吗?

如果包名称与bin名称相同,并且main.ars位于工作区的同一 crate 中,则无法添加对lib.ars的依赖

如何实现Serde::Ser::Error的调试

在复制类型中使用std::ptr::WRITE_VILAR进行内部可变性的安全性(即没有UnSafeCell)

应为关联类型,找到类型参数

是否可以使用Serde/Rust全局处理无效的JSON值?

为什么HashMap::get和HashMap::entry使用不同类型的密钥?

存储返回 impl Trait 作为特征对象的函数

闭包返回类型的生命周期规范

Some(v) 和 Some(&v) 有什么区别?

当 T 不是副本时,为什么取消引用 Box 不会抱怨移出共享引用?

使用 `.` 将 T 转换为 &mut T?

带有库+多个二进制文件的Cargo 项目,二进制文件由多个文件组成?