gpt4 book ai didi

rust - 返回 Future 类型时无法推断类型 F

转载 作者:行者123 更新时间:2023-11-29 08:26:47 26 4
gpt4 key购买 nike

我正在尝试编写一个返回 Future 的函数, 所以关注 a tutorial from Tokio ,我想到了这个:

extern crate tokio;

use std::time::{Duration, Instant};
use tokio::prelude::*;
use tokio::timer::Interval;

fn run<F>() -> impl Future<Item = (), Error = F::Error>
where
F: Future<Item = ()>,
{
Interval::new(Instant::now(), Duration::from_millis(1000))
.for_each(move |instant| {
println!("fire; instant={:?}", instant);
Ok(())
})
.map_err(|e| panic!("interval errored; err={:?}", e))
}

fn main() {
tokio::run(run());
}

playground

我收到这个错误:

error[E0282]: type annotations needed
--> src/main.rs:20:16
|
20 | tokio::run(run());
| ^^^ cannot infer type for `F`

我假设一旦我指定了完整的返回类型,错误就会消失,我什至无法弄清楚(我的 IDE 给了我 <futures::MapErr<futures::stream::ForEach<tokio::timer::Interval, [closure@src/ir.rs:24:23: 38:14 self:_], std::result::Result<(), tokio::timer::Error>>, [closure@src/ir.rs:39:22: 39:65]>)

  1. 如何确定类型?任何 IDE 提示或技巧? (我正在使用带有 ide-rust 的 Atom)

  2. 我能以某种方式摆脱定义 impl Future<Item = (), Error = F::Error> where F: Future<Item = ()> 吗? ?

    我可以在 run 的某处定义完整类型函数,但我想在函数外部公开 <Future<Item = (), Error = F::Error>><Future<Item = (), Error = io::Error>>

最佳答案

tokio::run的签名:

pub fn run<F>(future: F) 
where
F: Future<Item = (), Error = ()> + Send + 'static,

消费的 future 必须具有等于 () 的关联 Error 类型。这意味着您不能对错误通用。

这个有效:

fn run() -> impl Future<Item = (), Error = ()> {
Interval::new(Instant::now(), Duration::from_millis(1000))
.for_each(move |instant| {
println!("fire; instant={:?}", instant);
Ok(())
})
.map_err(|e| panic!("interval errored; err={:?}", e))
}

fn main() {
tokio::run(run());
}

关于rust - 返回 Future 类型时无法推断类型 F,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53056807/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com