在闭包中通过引用保存一个值

Keeping a value by reference inside a closure

鉴于以下示例,我想在我的闭包中通过引用使用 z

struct Foo<'a> {
  x: Box<dyn Fn() + Send + Sync + 'a>,
  y: Box<dyn Fn() + Send + Sync + 'a>,
}

impl<'a> Foo<'a> {
  fn new(z: &'a str) -> Foo<'a> {
    let x = Box::new(|| { z; });
    let y = Box::new(|| { z; });
    Foo {
      x,
      y,
    }
  }
}

然而,这个实现给出了错误:

closure may outlive the current function, but it borrows 'z', which is owned by the current function.

我可以使用 move,但我想通过引用来完成。我怎样才能让编译器满意?

我目前的想法是将函数和闭包设置为相同的生命周期,但我找不到相关文档。

I can use move but I'd like to do it by reference. How can I satisfy the compiler?

在这种情况下,您是通过引用来完成的。 z 已经是一个参考,所以你会 move 一个参考。通过省略 move,您将创建一个 &'b &'a str 类型的新引用(&'b 仅存在于您的函数内部)。