В Rust есть функция для непрерывного «сворачивания» потока, то есть отображения с состоянием? - PullRequest
0 голосов
/ 16 февраля 2020

У меня есть фьючерс :: поток :: поток сообщений веб-сокета, которые представляют изменения состояния, и я хочу поток состояния. Я сталкивался с методом fold, который делает нечто подобное, но он собирает все в одно конечное состояние, а не создает новый поток всех промежуточных состояний.

Например, у меня есть начальное состояние " 0 "и поток событий" приращения "и" уменьшения ", я хочу поток результирующих чисел.

Ответы [ 2 ]

0 голосов
/ 17 февраля 2020

В мире Iterator scan будет подходящим адаптером для этой работы. Но Stream не является Iterator, поэтому мы не можем использовать методы Iterator.

Черта StreamExt предоставляет методы расширения для Stream черта. Многие из этих методов являются адаптированными версиями методов адаптера Iterator. Это включает scan.

0 голосов
/ 16 февраля 2020

Как отметил Робин Зигмонд в комментариях, вам, вероятно, нужна функция Iterator::scan.

Пример:

/// Our "event" type, with increment and decrement events.
#[derive(Debug)]
enum Event {
    Inc,
    Dec,
}

/// For simplicity, the `Event::apply` function will modify our integer
/// depending on the event.
impl Event {
    fn apply(&self, n: i32) -> i32 {
        match self {
            Inc => n + 1,
            Dec => n - 1,
        }
    }
}

/// Import `Event::Inc` and `Event::Dec` into scope so we can access them as
/// simply `Inc` and `Dec`.
use Event::{Inc, Dec};

fn main() {
    // List of events
    let events = &[ Inc, Inc, Dec, Inc, Dec, Dec ];

    let values: Vec<_> = events.iter().scan(0i32, |n, ev| {
        // `n` is a mutable reference to the "state" of the scan.
        // It initially has the value `0i32`, but we can modify it each time
        // the closure is called.
        *n = ev.apply(*n);

        // The closure can return `Some(expr)`, which is the next value of the
        // iterator, or `None` to end early. In our case we just return the state.
        Some(*n)
    }).collect();

    println!("events = {:?}", events); // [Inc, Inc, Dec, Inc, Dec, Dec]
    println!("values = {:?}", values); // [1, 2, 1, 2, 1, 0]
}

Пример детской площадки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...