Как использовать take_ while с futures :: Stream? - PullRequest
0 голосов
/ 23 февраля 2019

Я пытаюсь понять, какой синтаксис я должен использовать для take_while() с futures::Stream; ящиком (0.1.25).Вот фрагмент кода ( на игровой площадке ):

use futures::{stream, Stream}; // 0.1.25

fn into_many(i: i32) -> impl Stream<Item = i32, Error = ()> {
    stream::iter_ok(0..i)
}

fn main() {
    println!("start:");
    let _ = into_many(10)
        // .take_while(|x| { x < 10 })
        .map(|x| {
            println!("number={}", x);
            x
        })
        .wait();
    for _ in foo {} // ← this (by @mcarton)

    println!("finish:");
}

Основная цель - определить правильные комбинации операторов / команд для успешного запуска представленной игровой площадки с помощью take_while: когдаЯ раскомментирую свой take_ while (), он говорит:

expected &i32, found integral variable | help: consider borrowing here: &10

, и если я добавлю ссылку, он говорит:

error[E0277]: the trait bound bool: futures::future::Future is not satisfied

, что странно для меня.

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

take_while ожидает, что закрытие вернет будущее или что-то, что может быть преобразовано в будущее.bool не реализует IntoFuture, поэтому вам придется обернуть его в будущем.future::ok возвращает будущее, которое немедленно готово с указанным значением.

use futures::{future, stream, Stream}; // 0.1.25

fn into_many(i: i32) -> impl Stream<Item = i32, Error = ()> {
    stream::iter_ok(0..i)
}

fn main() {
    println!("start:");
    let foo = into_many(10)
        .take_while(|&x| { future::ok(x < 10) })
        .map(|x| {
            println!("number={}", x);
            x
        })
        .wait();

    for _ in foo {}

    println!("finish:");
}
0 голосов
/ 23 февраля 2019

wait возвращает версию потока итератора, но этот итератор остается ленивым, что означает, что вам нужно выполнить итерацию для фактического выполнения вашего закрытия:

use futures::{stream, Stream}; // 0.1.25

fn into_many(i: i32) -> impl Stream<Item = i32, Error = ()> {
    stream::iter_ok(0..i)
}

fn main() {
    println!("start:");
    let foo = into_many(10)
        // .take_while(|x| { x < 10 })
        .map(|x| {
            println!("number={}", x);
            x
        })
        .wait();

    for _ in foo {} // ← this

    println!("finish:");
}

( ссылка на игровую площадку )

...