Хранение значения по ссылке внутри замыкания - PullRequest
1 голос
/ 29 апреля 2019

Учитывая следующий пример, я хотел бы использовать 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 Ответ

4 голосов
/ 29 апреля 2019

Я могу использовать движение, но я бы хотел сделать это по ссылке. Как я могу удовлетворить компилятор?

В этом случае вы делаете это по ссылке. z уже является ссылкой, поэтому вы должны move ссылку. Опуская move, вы создаете новую ссылку типа &'b &'a str (&'b только внутри вашей функции).

...