StreamExt::forward 出现错误 `expected integer, found enum `std::result::Result``。

3

我正在尝试将rust futures流(repeat)连接到一个接收器(drain)。 第一种方法很好地工作(请参见以下内容),但第二种使用.forward的方法无法编译(错误显示在行内)。有什么指针可以告诉我我做错了什么吗?

use futures::stream::StreamExt;
use futures::sink::SinkExt;
use futures::executor;

fn main() {
    executor::block_on( async {
        // works
        let mut work = futures::stream::repeat(5);
        let mut drain = futures::sink::drain();
        match drain.send(work.next()).await {
            Ok(_r) => println!("Done"),
            Err(_e) => println!("Error"),
        };

        // works
        let res: Vec<i32> = futures::stream::repeat(5).take(3).collect::<Vec<i32>>().await;
        println!("{:?}", res);

        // doesn't work
        // futures::stream::repeat(5).forward(futures::sink::drain());
        //                            ^^^^^^^ expected integer, found enum `std::result::Result`
        //  error[E0271]: type mismatch resolving `<futures_util::stream::repeat::Repeat<{integer}> as futures_core::stream::Stream>::Item == std::result::Result<_, _>`

        // Fixed above with repeat(Ok(5)) but not repeat(5)
        match futures::stream::repeat(Ok(5)).take(3).forward(futures::sink::drain()).await {
            Ok(_r) => println!("Done"),
            Err(_e) => println!("Error"),
        };
    });
}

相关文档


你说得对。已经修复了。 - Shadi
1个回答

0

我猜你想要的更像是这样的吧?

use futures::stream::StreamExt;
use futures::sink::SinkExt;

#[tokio::main]
async fn main() {
    // works
    let mut work = futures::stream::repeat(5);
    let mut drain = futures::sink::drain();
    match drain.send(work.next()).await {
        Ok(_r) => println!("Done"),
        Err(_e) => println!("Error"),
    };
    // doesn't work

    futures::stream::repeat(Ok(5)).forward(futures::sink::drain());
}

正如错误信息(有点令人困惑)所示,在这种情况下,重复调用必须带有一个Result参数。


确实。将错误消息反转为“期望枚举std :: result :: Result,但发现整数”会更有意义,不是吗? - Shadi
@shadi 我认为异步操作的错误信息目前存在漏洞。 - Stargateur
我不确定它是否太糟糕了。根据我的解决方案,你可能会直觉地认为它是相反的,因为它未能找到满足“forward”函数而不是“repeat”参数的类型。 “forward”函数规定了一个“Result”类型,因此出现了这个消息。在我学习Rust的这一点上,我可能没有理解正确。 - w08r

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接