这个函数返回一个闭包。使用 impl Fn()
作为闭包类型是可以的:
fn foo() -> impl Fn() {
|| ()
}
但这行不通:
fn foo<T: Fn()>() -> T {
|| ()
}
也不是这个:
fn foo<T>() -> T
where
T: Fn(),
{
|| ()
}
为什么最后两个例子不起作用?
最佳答案
在这两个“非工作”示例中,思考为什么 T
被称为类型参数 可能会有所帮助。
函数的参数由函数的调用者决定,类型也是如此。有时它们是明确指定的,有时它们是推断出来的,但总是由调用者说出它们是什么,并且实现必须适用于所有可能的类型。这有时称为通用量化(在数学中,∀T
)。
但是,您的示例中的闭包类型不能由调用者提供,因为它是函数体的实现细节。闭包的类型由函数固定,调用者指定不同的类型没有意义。
在您的第一个示例中,它之所以有效,是因为返回位置中的 impl Fn()
意味着正在发生的事情。也就是说,从调用者的角度来看,具体类型是未知的,但它是由实现唯一确定的。这被称为存在量化(在数学中,∃T
)——一种我们可以确信存在的类型,尽管我们不一定知道它到底是什么。
https://stackoverflow.com/questions/74205672/