我以为我已经知道了'static
生命是什么,但现在我不确定了。
我正在尝试了解如何使用 Tokio 和 Futures。我的应用程序正在运行,但结构很糟糕,所以我需要分解它。这是'static
我的闭包的要求,我不知道如何解决。
例如,在一个main
函数中,我有一个句柄并且能够spawn
为其循环的未来:
let mut core = tokio_core::reactor::Core::new().unwrap();
let handle = core.handle();
let future = {
ok(())
};
它编译;现在我想移出一些逻辑:
struct Test;
impl Test {
fn test(&self, handle: tokio_core::reactor::Handle) {
let future = {
ok(())
};
handle.spawn(future);
}
}
它也编译。当我的结构变得更复杂时:
struct Test<'a> {
api: &'a Arc<Api>,
}
impl<'a> Test<'a> {
fn new(api: &'a Arc<Api>) -> Self {
Test {
api: api,
}
}
fn test(&self, msg: &telegram_bot::types::Message, handle: tokio_core::reactor::Handle) {
let api = self.api.clone();
let future = ok(10);
let future2 = move |x| {
api.send(msg.text_reply(format!("reply: {}", x))) // returns Future
}.map(|_| ()).map_err(|_| ()); // let's ignore the results for now
handle.spawn(future.and_then(future2));
}
}
...我遇到
error[E0477]: the type `futures::AndThen<futures::FutureResult<i32, ()>, futures::FutureResult<(), ()>, [closure@src/main.rs:63:23: 66:10 api:std::sync::Arc<telegram_bot::Api>, msg:&telegram_bot::Message]>` does not fulfill the required lifetime
handle.spawn(future.and_then(future2));
^^^^^
note: type must satisfy the static lifetime
我认为它对我的关闭大喊大叫。如果我在我的 'edmain
函数中使用它,那么同样的未来也会起作用。Arc
Api
将其移动到具有引用(如单独的“处理器”)的结构中会'static
导致错误。