理解 Rust 闭包:为什么它们持续持有可变引用?

问题描述 投票:0回答:0

我目前正在学习 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 对闭包强制执行这种行为?为什么闭包不能在第一次使用后释放可变引用(就像函数那样)并在第二次使用之前重新获取它?这种方法对我来说似乎更直观,因为它允许闭包的行为类似于函数,而无需持续持有可变引用。任何见解将不胜感激!

rust closures
© www.soinside.com 2019 - 2024. All rights reserved.