rust - 如何从闭包内部修改在闭包外部定义的变量?

标签 rust

如何从闭包内部修改在闭包外部定义的变量?

代码:

fn main() {
    let mut t = "foo".to_string();
    println!("{}", t);

    let mut closure = | | {
        t.clear();
    };
    closure();

    println!("{}", t);
}

编译错误:

cannot borrow `t` as immutable because it is also borrowed as mutable [--explain E0502]

最佳答案

和你做的一样;那不是这里的问题。完整的错误消息显示了更多详细信息:

error: cannot borrow `t` as immutable because it is also borrowed as mutable [--explain E0502]
    |>         let mut closure = || {
    |>                           -- mutable borrow occurs here
    |>             t.clear();
    |>             - previous borrow occurs due to use of `t` in closure
...
    |>     println!("{}", t);
    |>                    ^ immutable borrow occurs here
    |> }
    |> - mutable borrow ends here

您已将变量的可变引用提供给闭包,并且闭包仍在范围内。这意味着它保留了引用,并且您无法拥有对该变量的任何其他引用。这显示了同样的问题:

fn main() {
    let mut t = "foo".to_string();
    println!("> {}", t);
    let not_a_closure = &mut t;
    println!("> {}", t);
}

在较小范围内创建闭包会强制闭包超出范围并在调用 println! 之前释放引用:

fn main() {
    let mut t = "foo".to_string();
    println!("> {}", t);

    {
        let mut closure = || {
            t.clear();
        };
        closure();
    }

    println!("> {}", t);
}

我建议查看 60+ other questions with the same error message有关该错误的更多信息。

关于rust - 如何从闭包内部修改在闭包外部定义的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38423607/

相关文章:

macros - 如何编写函数(或宏)来创建 Vec 和对它的引用?

rust - 如何存储迭代器或对象的异构列表,这些列表可以转换为可以多次使用的迭代器?

rust - 为什么第二次要重复写 `mut`?

rust - 如何为使用生命周期实现的特征传递函数?

Rust 无法返回引用 HashMap get 上的局部变量的值

rust - 使用 peekable 时意外的迭代器行为

rust - 如何从多个迭代器类型中收集?

multithreading - 是否可以强制恢复休眠线程?

c - 64 位整数按位运算的成本与 8 位整数相同吗?

rust - 如何使用具有自引用结构的 Pin 结构?