将非静态寿命传递给火箭队的管理层

时间:2019-04-30 15:36:48

标签: rust rust-rocket

如何将具有非静态寿命的对象传递给Rocket的manage?目前,我遵循以下原则:

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,其中包含使用运行时参数初始化的带框闭包。 args包含密码,密钥和机密之类的东西-实际代码是开源的,因此可以在here中找到。它是WIP,所以会有所变化,并且不是最新的,但希望能为最终目标提供一个思路。

1 个答案:

答案 0 :(得分:1)

您不能使用非静态生存期,因为manage()的签名实际上是Send + Sync + 'staticdocumentation for State中说明了此原因:

  

要管理的类型必须是线程安全的,并且可以跨线程边界发送。换句话说,它必须实现Send + Sync +'static。

也就是说,由于(工作人员)线程可以随时访问托管状态,并且由于无法保证这些线程何时退出,因此托管状态必须至少存在与整个程序一样长的时间。就是'static

您可以尝试将foo()更改为bar: Bar<'static>,而不是一般的寿命,然后从此开始。对'static的要求通常听起来并不那么糟糕,因为所有拥有的值(例如String::new())都是'static,只要它们不包含对其他事物的引用即可。

如果您不能提供Bar<'static>,则可以使用Arc代替普通引用,因此Bar<'a>会变成Bar。这里的基本原理是Bar拥有原子计数的引用而不是引用,因此持有Bar可以保证Bar处于活动状态时所有成员都处于活动状态。这使得Bar 'static