Skip to content
Rust:函数、闭包、Fn特质
📆2022-02-01 | ✍2022-03-13 | 📂Rust

特质用途

  • 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

参考文章

Nichts Hsu - Rust 中函数与闭包与 Fn Traits 探讨

Last updated: