Передача нестатического времени жизни в управление Rocket - PullRequest
0 голосов
/ 30 апреля 2019

Как я могу передать объект с нестатическим временем жизни в manage Rocket?В настоящее время у меня есть что-то вроде этого:

fn foo<'a>(bar: Bar<'a>) -> Result<(), Error> {
  rocket::ignite()
    .manage(bar)
    .mount("/", routes![index])
    .launch();

  Ok(())
}

Но я получаю следующую ошибку:

cannot infer an appropriate lifetime due to conflicting requirements

note: ...so that the expression is assignable:
      expected bar::Bar<'_>
         found bar::Bar<'a>
note: but, the lifetime must be valid for the static lifetime...

Чтобы добавить больше контекста, Bar - это struct, содержащий закрытые в штучной упаковке замыкания, которыеполучить инициализацию с использованием аргументов времени выполнения.Аргументы содержат такие вещи, как пароли, ключи и секреты - фактический код является открытым исходным кодом, поэтому его можно найти здесь .Это WIP, поэтому он изменится и не совсем обновлен, но, надеюсь, дает представление о конечной цели.

1 Ответ

1 голос
/ 01 мая 2019

Нельзя использовать нестатическое время жизни, потому что подпись manage() буквально говорит Send + Sync + 'static. Причина этого указана в документации для государства :

Управляемый тип должен быть потокобезопасным и передаваться через границы потоков. Другими словами, он должен реализовывать Send + Sync + 'static.

То есть, поскольку (рабочие) потоки могут получить доступ к управляемому состоянию в любое время, и поскольку нет гарантии, когда эти потоки могут выйти, управляемое состояние должно существовать как минимум столько же, сколько вся программа; это 'static.

Вы можете попробовать изменить foo(), чтобы взять bar: Bar<'static> вместо общего срока службы и продолжить свой путь оттуда. Требование 'static обычно не так плохо, как кажется, поскольку все собственные значения (например, String::new()) равны 'static, если они не содержат ссылок на другие вещи.

Если вы не можете предоставить Bar<'static>, вы можете использовать Arc вместо простых ссылок, поэтому Bar<'a> становится Bar. Обоснование здесь заключается в том, что Bar содержит ссылки с атомным подсчетом вместо ссылок, поэтому наличие Bar гарантирует, что все члены живы, а Bar жив. Это составляет Bar 'static.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...