面试题答案
一键面试-
FnMut trait闭包与Fn trait闭包的不同:
- Fn trait闭包:实现
Fn
trait的闭包是不可变借用闭包,意味着它可以多次调用,并且不会修改捕获的环境变量。它使用&self
调用约定,类似于调用普通的不可变方法。 - FnMut trait闭包:实现
FnMut
trait的闭包可以修改其捕获的环境变量。它使用&mut self
调用约定,这允许闭包对捕获的变量进行可变访问。所有实现Fn
的闭包也自动实现FnMut
,因为不可变借用可以升级为可变借用,但反之则不成立。
- Fn trait闭包:实现
-
示例代码:
fn main() {
let mut counter = 0;
let mut increment = || counter += 1;
increment();
println!("Counter: {}", counter);
}
在上述代码中,increment
闭包捕获了counter
变量,并通过FnMut
闭包对其进行修改。每次调用increment
闭包时,counter
的值会增加1。