你理解的 Fn、FnMut、FnOnce 可能从一开始就错了...

文章目录
- 函数与闭包的“类型”
- Fn、FnMut、FnOnce 之间的关系
- “反直觉”的约束关系
- Fn、FnMut、FnOnce 的深层含义
- 为什么 Fn 可以当 FnOnce 用?
诚如我们在《一团乱麻?带你厘清 Rust 中的函数指针、函数项、fn 类型、Fn Trait》中介绍过的那样,Rust 将它的函数和闭包的类型最终统一于 Fn、FnMut、FnOnce 这三个 trait 上,实现了函数和闭包的“大一统”愿景,为函数和闭包作为参数在各处传递铺平了道路。当时,我们认为故事进行到那里就已经结束了,Fn、FnMut、FnOnce 这三个 trait 虽是最后出场的关键角色,但本身却“乏善可陈”,它们各自只有一个方法,可聊的确实不多。但是,很快我们就会在实际编程中意识到问题:我们对于 Fn、FnMut、FnOnce 的认识过于肤浅,甚至出现了很大的偏差。一个典型的例子就是:当我们第一次看到一个函数的类型约束是 F:FnOnce() -> T 时往往会认为这是一个很严格的约束,因为它只接受一次性闭包,然而实际上,它却是最宽松的约束,所有的函数和闭包(只要参数和返回值的数量和类型得匹配上)都可以传入。绝大多数的 Rust 初学者都会对 Fn、FnMut、FnOnce 这三个 trait 产生极大的误解,这是由多种因素叠加造成的,里面有很多“故事”,远不是三个“单薄”的 trait 那样简单。本文原文链接 https://laurence.blog.csdn.net/article/details/165326831 禁止转载!
完整阅读,请移步 《你理解的 Fn、FnMut、FnOnce 可能从一开始就错了...》 https://laurence.blog.csdn.net/article/details/165326831

浙公网安备 33010602011771号