我有一个起作用的功能:
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 Code Online (Sandbox Code Playgroud)
label在这种情况下,我想创建一个结构,该结构将使用一种run利用参数的方法来保存一些参数():
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());
}
Run Code Online (Sandbox Code Playgroud)
我得到的是:
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 Code Online (Sandbox Code Playgroud)
我已经阅读了“ Rust by Example”中的“ Advanced Lifetimes”和“ Validating References with Lifetimes”,但我仍然不知道如何解决。
为什么ir寿命不够长?
我已经在尝试调用的范围内创建了它ir.run(),所以我认为它会一直存在。
如果您重写:
tokio::run(ir.run());
Run Code Online (Sandbox Code Playgroud)
如:
tokio::run(Ir::run(&ir))
Run Code Online (Sandbox Code Playgroud)
错误变得更加清楚:
tokio::run(ir.run());
Run Code Online (Sandbox Code Playgroud)
由于tokio::run需要'static一生的未来:
pub fn run<F>(future: F)
where
F: Future<Item = (), Error = ()> + Send + 'static,
Run Code Online (Sandbox Code Playgroud)
为了避免生命周期问题,请考虑使用此Ir值:
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))
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
262 次 |
| 最近记录: |