【问题标题】:Can I capture some things by reference and others by value in a closure?我可以在闭包中通过引用和值来捕获一些东西吗?
【发布时间】:2025-11-23 19:50:01
【问题描述】:

假设我们有以下代码,我在其中定义了一个名为 closure 的闭包。在这个闭包中,我想通过不可变引用(&T)使用外部x,同时通过获取所有权使用y。我怎样才能做到这一点?如果我使用move,闭包中使用的所有外部变量都将被移动到闭包中。而且这里的外部变量y 也是可复制的。

let x: i32 = 1;
let y: i32 = 2;
let closure = || {
    println!("{}", x);  // make sure x is used by &T.
    // println!("{}", y);  // how can I use y by taking its ownership?
};
closure();

【问题讨论】:

标签: rust closures ownership


【解决方案1】:

请注意,通过移动引用进行捕获等同于通过引用进行捕获。

当您在闭包中添加move 关键字时,是的,所有内容都通过移动来捕获。但是你可以移动一个引用,这就是没有 move 关键字的闭包所做的。

let x: i32 = 1;
let y: i32 = 2;
let closure = {
    let x = &x;
    move || {
        println!("{}", x);  // borrowing (outer) x
        println!("{}", y);  // taking the ownership of y
    }
};
closure();

【讨论】:

  • 另一个有用的习惯用法是打开一个范围来创建闭包,并使用let x = &x 强制借用另一个move 闭包:play.rust-lang.org/…
  • @user4815162342 很好的做法!我已经更新了我的答案。
  • 谢谢;我已经继续并相应地更新了评论。
最近更新 更多