在Rust中,闭包何时实现Fn、FnMut和FnOnce?
我是Rust新手,正在尝试理解闭包。我读过关于Fn、FnMut和FnOnce trait的内容,但不太明白编译器何时选择哪一个。我写了一个小例子:
```rust
fn main() {
let x = 10;
let print_x = || println!("{}", x); // 闭包1
let mut y = String::from("hello");
let append = || y.push_str(" world"); // 闭包2
let z = String::from("rust");
let consume = || drop(z); // 闭包3
}
```
为什么第一个闭包作为Fn工作,第二个作为FnMut,第三个作为FnOnce?这如何影响我可以调用闭包的次数?如果我将这样的闭包传递给函数,如何知道它期望哪个trait?希望能有示例解释。
<<>>
简短回答:一切取决于闭包如何使用捕获的变量
Rust编译器根据闭包对外部捕获变量的操作,自动确定闭包实现了三个trait中的哪一个。