StreamExt :: forward завершается с ошибкой `ожидаемое целое число, найдено перечисление` std :: result :: Result`` - PullRequest
3 голосов
/ 15 января 2020

Я пытаюсь подключить поток ржавчины фьючерсов (повтор) к раковине (сток). Первый метод работает нормально (проверьте ниже), но второй с .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"),
        };
    });
}

Соответствующие документы

1 Ответ

0 голосов
/ 15 января 2020

Полагаю, вы хотели что-то более похожее на это?

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.

...