where是一个能够让我们添加类型约束的关键字。对于F类型参数,我们可以在内部定义约束map<U, F: FnOnce(Self::Output) -> U,但是使用 where 语句可读性会更好。
FnOnce(Self::Output) -> U是一个函数的类型定义,该函数接收当前类型的Output并返回任意类型U。FnOnce是函数 trait 中的一个,其他还包括FnMut和Fn。FnOnce是用起来最简单的,因为编译器可以保证这个函数只被调用一次。它使用环境中用到的值并获取其所有权。Fn和FnMut分别以不可变和可变的方式借用环境中值的引用。所有的闭包都实现了FnOncetrait,并且其中一些没有移动值的闭包还实现了FnMut和Fntrait。这是 Rust 做的最酷的事情之一,允许对闭包和第一类函数参数进行真正有表达力的使用。Rust book 中的相关内容[6]值得一读。