【发布时间】:2018-10-30 11:06:21
【问题描述】:
我有一个有效的功能:
extern crate tokio;
use std::time::{Duration, Instant};
use tokio::prelude::*;
use tokio::timer::Interval;
fn run(label: String) -> impl Future<Item = (), Error = ()> {
Interval::new(Instant::now(), Duration::from_millis(1000))
.for_each(move |instant| {
println!("fire; instant={:?}, label={:?}", instant, label);
Ok(())
})
.map_err(|e| panic!("interval errored; err={:?}", e))
}
fn main() {
tokio::run(run("Hello".to_string()));
}
我想创建一个结构,在这种情况下使用一个方法 run 来保存一些参数 (label),该方法将利用这些参数:
extern crate tokio;
use std::time::{Duration, Instant};
use tokio::prelude::*;
use tokio::timer::Interval;
struct Ir {
label: String,
}
impl Ir {
fn new(label: String) -> Ir {
Ir { label }
}
fn run(&self) -> impl Future<Item = (), Error = ()> + '_ {
Interval::new(Instant::now(), Duration::from_millis(1000))
.for_each(move |instant| {
println!("fire; instant={:?}, label={:?}", instant, self.label);
Ok(())
})
.map_err(|e| panic!("interval errored; err={:?}", e))
}
}
fn main() {
let ir = Ir::new("Hello".to_string());
tokio::run(ir.run());
}
我得到的是:
error[E0597]: `ir` does not live long enough
--> src/main.rs:28:16
|
28 | tokio::run(ir.run());
| ^^ borrowed value does not live long enough
29 | }
| - borrowed value only lives until here
|
= note: borrowed value must be valid for the static lifetime...
我已阅读“Rust by Example”中的“Advanced Lifetimes”和“Validating References with Lifetimes”,但我仍然不明白如何修复它。
为什么ir 的寿命不够长?
我已经在我试图调用ir.run() 的同一范围内创建了它,所以我认为它会一直存在。
【问题讨论】:
-
从 tokio 运行要求生命周期是静态的,tokio-rs.github.io/tokio/tokio/runtime/fn.run.html。
-
所以签名应该是
fn run(&self) -> impl Future<Item = (), Error = ()> + 'static {? -
我想但是我显然不够熟练,那次运行必须消耗
self而不是作为参考。 -
@Stargateur 你是对的,消费
self解决了问题!
标签: rust