我目前正在学习 Rust 中的闭包,并试图理解为什么它们在最后一次使用之前一直持有引用。
考虑以下代码:
fn borrows_mutably_func(list: &mut Vec<i32>) {
list.push(4);
}
fn main() {
let mut list = vec![1, 2, 3];
println!("Before defining: {:?}", list);
borrows_mutably_func(&mut list);
println!("After calling first (func): {:?}", list);
borrows_mutably_func(&mut list);
println!("After calling second (func): {:?}", list);
let mut borrows_mutably_closure = || list.push(5);
borrows_mutably_closure();
println!("After calling first (closure): {:?}", list);
borrows_mutably_closure();
println!("After calling second (closure): {:?}", list);
}
在此代码中,
borrows_mutably_func
是一个函数,它通过向list
添加一个元素来改变它。可以多次调用此函数而不会出现任何问题。但是,当我尝试使用闭包 (borrows_mutably_closure
) 复制此行为时,代码无法编译。
根据我的理解,出现这个问题是因为闭包通过可变引用捕获
list
并持续保留该引用直到最后一次使用。这与函数不同,后者在每次调用后释放引用。
我的问题是:为什么 Rust 对闭包强制执行这种行为?为什么闭包不能在第一次使用后释放可变引用(就像函数那样)并在第二次使用之前重新获取它?这种方法对我来说似乎更直观,因为它允许闭包的行为类似于函数,而无需持续持有可变引用。任何见解将不胜感激!