- 常见捕获方式
- 按值捕获(
move
语义):闭包获取变量的所有权。
- 按引用捕获(不可变借用):闭包借用变量的不可变引用。
- 按可变引用捕获(可变借用):闭包借用变量的可变引用。
- 区别
- 按值捕获(
move
语义):
- 所有权:变量所有权转移到闭包中。一旦闭包捕获变量,外部作用域不能再使用该变量。
- 示例:
fn main() {
let num = 5;
let closure = move || {
println!("The number is: {}", num);
};
// 下面这行代码会报错,因为num的所有权已被闭包拿走
// println!("num: {}", num);
closure();
}
- 按引用捕获(不可变借用):
- 所有权:变量所有权仍在外部作用域,闭包只是借用不可变引用,外部作用域在闭包生命周期内可以继续使用该变量,但不能修改。
- 示例:
fn main() {
let num = 5;
let closure = || {
println!("The number is: {}", num);
};
println!("num: {}", num);
closure();
}
- 按可变引用捕获(可变借用):
- 所有权:变量所有权仍在外部作用域,闭包借用可变引用。在闭包使用该可变引用期间,外部作用域不能再使用该变量,以避免数据竞争。
- 示例:
fn main() {
let mut num = 5;
let closure = || {
num += 1;
println!("The number is: {}", num);
};
// 下面这行代码会报错,因为闭包借用了num的可变引用
// println!("num: {}", num);
closure();
}