- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 futures
和 tokio
crate 进行异步操作,没有遇到任何问题。现在我正在实现一个异步加载数据然后执行一些转换的存储,但我的界面似乎有一些我无法理解的生命周期问题。
这是显示相同症状的简化测试代码;真正的函数体执行比总是返回错误更合理的 Action :
extern crate futures; // v0.1 (old)
use futures::prelude::*;
use futures::future;
pub enum MyError {
SomeError,
}
pub trait KeyValueStore {
type ValueType;
fn load(&self, key: String) -> Box<Future<Item = Vec<u8>, Error = MyError>>;
fn deserialize(&self, serialized_obj: Vec<u8>) -> Result<Self::ValueType, MyError>;
fn resolve(&self, key: String) -> Box<Future<Item = Self::ValueType, Error = MyError>>;
}
pub struct Storage<Obj> {
_unused: std::marker::PhantomData<Obj>,
}
impl<Obj: 'static> KeyValueStore for Storage<Obj> {
type ValueType = Obj;
fn deserialize(&self, serialized_obj: Vec<u8>) -> Result<Self::ValueType, MyError> {
Err(MyError::SomeError)
}
fn load(&self, key: String) -> Box<Future<Item = Vec<u8>, Error = MyError>> {
Box::new(future::err(MyError::SomeError))
}
fn resolve(&self, key: String) -> Box<Future<Item = Self::ValueType, Error = MyError>> {
let result = self.load(key).and_then(|bytes| self.deserialize(bytes));
Box::new(result)
}
}
编译器拒绝此示例代码并存在以下生命周期问题:
error[E0495]: cannot infer an appropriate lifetime due to conflicting requirements
--> src/main.rs:36:9
|
36 | Box::new(result)
| ^^^^^^^^^^^^^^^^
|
note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the method body at 34:5...
--> src/main.rs:34:5
|
34 | / fn resolve(&self, key: String) -> Box<Future<Item = Self::ValueType, Error = MyError>> {
35 | | let result = self.load(key).and_then(|bytes| self.deserialize(bytes));
36 | | Box::new(result)
37 | | }
| |_____^
note: ...so that the type `futures::AndThen<std::boxed::Box<futures::Future<Error=MyError, Item=std::vec::Vec<u8>>>, std::result::Result<Obj, MyError>, [closure@src/main.rs:35:46: 35:77 self:&&Storage<Obj>]>` will meet its required lifetime bounds
--> src/main.rs:36:9
|
36 | Box::new(result)
| ^^^^^^^^^^^^^^^^
= note: but, the lifetime must be valid for the static lifetime...
note: ...so that expression is assignable (expected std::boxed::Box<futures::Future<Error=MyError, Item=Obj> + 'static>, found std::boxed::Box<futures::Future<Error=MyError, Item=Obj>>)
--> src/main.rs:36:9
|
36 | Box::new(result)
| ^^^^^^^^^^^^^^^^
我以前用hyper
或tokio-postgres
编写的代码似乎具有相同的逻辑,但从未产生过此类错误。如果没有引用资料,我什至看不出生命周期哪里会出错。我的直觉说它与通用 Obj
参数有某种关系,静态生命周期限制感觉不对。
什么情况会导致编译错误?
最佳答案
self
在self.deserialize
需要 &self
的生命周期参数 resolve
;结果不能装箱为 Box<Future<..>>
,这需要一个 'static
盒装生命周期 Future
.
您可以使用 Box<Future<..> + 'a>
覆盖盒装 future 的生命周期要求(其中 'a
是 self
参数的生命周期;您需要更改特征和实现中的 resolve
签名);但与往常一样,您对结果无能为力 Future
-based 事件循环将需要 'static
Future
的生命周期他们必须运行。
相反,您可以通过制作 deserialize
来解决此问题一个“静态方法”,即删除 &self
参数并通过 Self::deserialize
调用它相反。
将特征用作类型时的默认生命周期要求(在本例中为 'static
)记录在 Trait objects 中在引用中。
关于rust - 操作返回 Box<Future> 时的生命周期编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46917486/
我正在开发一个使用多个 turtle 的滚动游戏。玩家 turtle 根据按键命令在 Y 轴上移动。当危害和好处在 X 轴上移动时,然后循环并改变 Y 轴位置。我尝试定义一个名为 colliding(
我不明白为什么他们不接受这个作为解决方案,他们说这是一个错误的答案:- #include int main(void) { int val=0; printf("Input:- \n
我正在使用基于表单的身份验证。 我有一个注销链接,如下所示: 以及对应的注销方法: public String logout() { FacesContext.getCurren
在 IIS7 应用程序池中有一个设置 Idle-time out 默认是 20 分钟,其中说: Amount of time(in minutes) a worker process will rem
我是一名优秀的程序员,十分优秀!