此函数返回闭包.使用impl Fn()
作为闭合类型是可以的:
fn foo() -> impl Fn() {
|| ()
}
但这是行不通的:
fn foo<T: Fn()>() -> T {
|| ()
}
也不是这个:
fn foo<T>() -> T
where
T: Fn(),
{
|| ()
}
为什么最后两个例子不起作用?
此函数返回闭包.使用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
)--一种我们可以确信存在的类型,尽管我们不一定知道它实际上是什么.