🚧 Attention, peinture fraîche !
Cette page a été traduite par une seule personne et n'a pas été relue et vérifiée par quelqu'un d'autre ! Les informations peuvent par exemple être erronées, être formulées maladroitement, ou contenir d'autres types de fautes.
Vous pouvez contribuer à l'amélioration de cette page sur sa Pull Request.
Le trait Stream
Le trait Stream
ressemble à Future
, mais peut retourner plusieurs valeurs
avant de se terminer, un peu comme le trait Iterator
de la bibliothèque
standard :
trait Stream {
/// Le type de la valeur retournée par le flux.
type Item;
/// Tente de résoudre l'élément suivant dans le flux.
/// Retourne :
/// `Poll::Pending` s'il n'est pas encore prêt,
/// `Poll::Ready(Some(x))` si une valeur est prête,
/// `Poll::Ready(None)` si le flux est terminé.
fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>)
-> Poll<Option<Self::Item>>;
}
Un exemple courant d'un Stream
est le Receiver
pour le type channel
de la
crate futures
. Cela va retourner Some(val)
à chaque fois qu'une valeur est
envoyée par l'extrémité Sender
, et va retourner None
une fois que Sender
a été libéré de la mémoire et que tous les messages en cours ont été reçus :
async fn send_recv() {
const BUFFER_SIZE: usize = 10;
let (mut tx, mut rx) = mpsc::channel::<i32>(BUFFER_SIZE);
tx.send(1).await.unwrap();
tx.send(2).await.unwrap();
drop(tx);
// `StreamExt::next` ressemble à `Iterator::next`, mais retourne un type
// qui implémente `Future<Output = Option<T>>`.
assert_eq!(Some(1), rx.next().await);
assert_eq!(Some(2), rx.next().await);
assert_eq!(None, rx.next().await);
}