特质用途
- FnOnce:闭包持上下文变量的所有权。
- FnMut:闭包有通过可变引用访问上下文。
- Fn:闭包仅通过不可变引用访问上下文,或不访问上下文。
依赖关系
Fn
: FnMut
: FnOnce
函数的特质
任何一个函数都实现了FnOnce, FnMut, Fn, Copy
闭包
- 必定实现
FnOnce
- 若闭包实现
Fn
, 则必实现Copy
。 move
会移动闭包所捕获变量到自身的匿名结构体内,但不影响该闭包实现哪些Fn特质。- 若闭包实现
Fn
,添加move
,闭包的数据行为(Copy/Move
)与捕获变量一致。
闭包的Fn特质靠编译器的类型推理实现,每个闭包都有属于自己的匿名结构体存储捕获内容,俩闭包即使内容相同,它们的类型也相异。
调用
rust
// 看看 FnOnce 的源码
pub trait FnOnce<Args> {
type Output;
extern "rust-call" fn call_once(self, args: Args) -> Self::Output;
}
当调用一个函数或闭包时,编译器首先寻找call
调用,若无则寻call_mut
,再无则寻call_once
。
参考文章