在闭包内部通过引用保留值

时间:2019-04-29 11:42:33

标签: rust closures lifetime

给出以下示例,我想在封闭中通过引用使用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,但我想参考一下。我如何满足编译器的要求?

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

1 个答案:

答案 0 :(得分:4)

  

我可以使用move,但是我想参考一下。我如何满足编译器的要求?

在这种情况下,您正在做参考。 z 已经是参考,因此您将move作为参考。通过省略move,您将创建一个&'b &'a str类型的新引用(&'b仅位于函数内部)。