我目前正在学习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
添加元素来改变list
的函数.此函数可以多次调用,不会出现任何问题.然而,当我try 使用闭包(borrows_mutably_closure
)复制此行为时,代码无法编译.
根据我的理解,之所以会出现这个问题,是因为闭包通过一个可变的引用捕获了list
,并不断地保持这个引用,直到它最后一次使用.这与函数不同,后者在每次调用后释放引用.
我的问题是:为什么Rust要对闭包执行此行为?为什么闭包不能在第一次使用后释放可变引用(就像函数一样),并在第二次使用之前重新获取它?这种方法对我来说似乎更直观,因为它将允许闭包的行为类似于函数,而不需要连续持有可变引用.如有真知灼见,不胜感激!