Update closure.md

pull/308/head
Jesse 3 years ago committed by GitHub
parent 9a6edaaf7c
commit da5daef8aa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -233,7 +233,7 @@ where
其实,可以看得出这一长串是 `T` 的特征约束,再结合之前的已知信息:`query` 是一个闭包,大概可以推测出,`Fn(u32) -> u32` 是一个特征,用来表示 `T` 是一个闭包类型Bingo恭喜你答对了 其实,可以看得出这一长串是 `T` 的特征约束,再结合之前的已知信息:`query` 是一个闭包,大概可以推测出,`Fn(u32) -> u32` 是一个特征,用来表示 `T` 是一个闭包类型Bingo恭喜你答对了
那为什么不用具体的类型来标注 `query` 呢?原因很简单,每一个闭包实例都有独属于自己的类型,甚至于两个签名一模一样的闭包,它们的类型都可能是不同的,因此你无法用一个统一的类型来标注 `query` 闭包。 那为什么不用具体的类型来标注 `query` 呢?原因很简单,每一个闭包实例都有独属于自己的类型,即使于两个签名一模一样的闭包,它们的类型也是不同的,因此你无法用一个统一的类型来标注 `query` 闭包。
而标准库提供的 `Fn` 系列特征,再结合特征约束,就能很好的解决了这个问题. `T: Fn(u32) -> u32` 意味着 `query` 的类型是 `T`,该类型必须实现了相应的闭包特征 `Fn(u32) -> u32`。从特征的角度来看它长得非常反直觉,但是如果从闭包的角度来看又极其符合直觉,不得不佩服 Rust 团队的鬼才设计。。。 而标准库提供的 `Fn` 系列特征,再结合特征约束,就能很好的解决了这个问题. `T: Fn(u32) -> u32` 意味着 `query` 的类型是 `T`,该类型必须实现了相应的闭包特征 `Fn(u32) -> u32`。从特征的角度来看它长得非常反直觉,但是如果从闭包的角度来看又极其符合直觉,不得不佩服 Rust 团队的鬼才设计。。。

Loading…
Cancel
Save