- 按值捕获(move 语义)
- 说明:闭包获取变量的所有权。当闭包被调用时,捕获的变量会被移动到闭包内部,原作用域不再能访问该变量。
- 示例:
fn main() {
let num = 5;
let closure = move || println!("Captured value: {}", num);
// 下面这行代码会报错,因为 num 的所有权被闭包获取
// println!("num: {}", num);
closure();
}
- 应用场景:当需要将变量的所有权转移到闭包中,并且闭包可能会在原变量作用域结束后继续存活时使用。比如,将闭包传递给另一个线程执行,因为线程可能会在当前函数结束后继续运行,此时需要转移变量所有权到线程内的闭包中,以保证变量的生命周期与线程一致。
- 按不可变引用捕获
- 说明:闭包获取变量的不可变引用,原变量在闭包调用期间仍然可以在其他地方以不可变方式访问。
- 示例:
fn main() {
let num = 5;
let closure = || println!("Captured value: {}", num);
println!("num: {}", num);
closure();
}
- 应用场景:当闭包只需要读取变量的值,并且原变量在闭包执行期间不会被修改时使用。例如,在对集合进行迭代处理时,闭包用于计算一些基于集合元素的统计信息,只需要读取元素值,不修改原集合和元素。
- 按可变引用捕获
- 说明:闭包获取变量的可变引用,原变量在闭包调用期间只能通过该可变引用进行修改,不能在其他地方同时以可变方式访问。
- 示例:
fn main() {
let mut num = 5;
let closure = || {
num += 1;
println!("Captured value: {}", num);
};
closure();
println!("num: {}", num);
}
- 应用场景:当闭包需要修改捕获的变量,并且要保证在闭包执行期间对该变量修改的唯一性时使用。比如,在一个函数中需要通过闭包来更新某个状态变量的值。