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 包含密码、密钥和机密等内容 - 实际代码是开源的,因此可以在此处找到。它是 WIP,因此会发生变化,并且不完全是最新的,但希望为最终目标提供一个想法。
解决方案
您不能使用非静态生命周期,因为manage()
字面上的签名说Send + Sync + 'static
. 原因在State 的文档中说明:
被管理的类型必须是线程安全的并且可以跨线程边界发送。也就是说,它必须实现 Send + Sync + 'static。
也就是说,由于(工作)线程可以随时访问托管状态,并且由于无法保证这些线程何时可能退出,因此托管状态必须至少与整个程序一样长;那是'static
。
你可以尝试改变你的foo()
to takebar: Bar<'static>
而不是一个通用的生命周期,然后从那里开始工作。的要求'static
通常不像听起来那么糟糕,因为所有拥有的值(如String::new()
)'static
只要它们不包含对其他事物的引用。
如果你不能提供 a Bar<'static>
,你也许可以使用 aArc
而不是普通的引用,所以Bar<'a>
变成Bar
. 这里的基本原理是Bar
保存原子计数的引用而不是引用,因此Bar
保证所有成员在存活时Bar
都存活。这使得Bar
'static
.
作为旁注:当考虑'static
某种类型的要求'static
并不意味着该值实际上永远存在时,这可能会有所帮助。这只是意味着可以使价值永远存在。在您的情况下,State
无法强制其他线程不退出并破坏它们的值。因此State
,必须保证它所依据的所有价值观都可以随心所欲地存在State
。仅当这些值'static
位于线程边界时才适用。
推荐阅读
- reactjs - 如何在 React Hook Function 中传递 HTML 并在我的组件中安全显示?
- excel - 第 53 周刊
- java - 如何将谓词与集合一起使用
- android - 如何解决 Winodw 是光标窗口的完整问题?
- python - 将数据框文本列屏蔽为熊猫数据框中的新列
- xamarin.forms - Xamarin.Forms: CollectionView v/s ListView v/s TableView
- python - /createPost 处的 ValueError 无法分配“
大家好,我正在尝试使用 Django 发布图像文件。我不知道发生了什么,我在尝试修复一个错误时遇到了另一个错误,所以请查看代码,我在 /createPost 处遇到 ValueError 无法分配“<SimpleLazyObject: <d
- git - 如何将 Git Repo 从一个帐户克隆到另一个帐户
- amazon-web-services - 使用 AWS S3 和 CloudFront 进行 HTTP/2 服务器推送
- python - 将类的实例存储在字符串中