Avatar ·

在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中的哪一个。