按值捕获
- 特点:闭包获取变量的所有权,闭包内对变量的操作不会影响外部同名变量,且闭包执行后变量被消耗。
- 使用场景:当闭包需要独占变量的所有权,且不希望影响外部变量状态时使用。
- 代码示例:
fn main() {
let num = 5;
let closure = || {
println!("The value is: {}", num);
};
closure();
// 这里不能再使用 num,因为所有权被闭包获取
// println!("num: {}", num); // 这行代码会报错
}
按不可变引用捕获
- 特点:闭包以不可变引用的方式访问外部变量,外部变量在闭包执行期间不能被修改,但可以在闭包外正常使用,闭包不会获取变量的所有权。
- 使用场景:当闭包仅需读取外部变量,且外部变量在闭包执行期间不需要修改时使用。
- 代码示例:
fn main() {
let num = 5;
let closure = || {
println!("The value is: {}", num);
};
closure();
println!("num: {}", num);
}
按可变引用捕获
- 特点:闭包以可变引用的方式访问外部变量,允许在闭包内修改外部变量的值,外部变量在闭包执行期间不能被其他代码修改,闭包不会获取变量的所有权。
- 使用场景:当闭包需要修改外部变量,且确保闭包执行期间外部不会同时修改该变量时使用。
- 代码示例:
fn main() {
let mut num = 5;
let closure = || {
num += 1;
println!("The value is: {}", num);
};
closure();
println!("num: {}", num);
}