Модуль array
Вспомогательные функции и типы для массивов фиксированной длины.
Структуры
| Имя | Описание |
|---|---|
AggregateError | Коллекция ошибок. |
Chain | Поток, который объединяет несколько потоков один за другим. |
Join | Future, который ожидает завершения двух future схожего типа. |
Merge | Поток, который объединяет несколько потоков в один поток. |
Race | Future, который ожидает завершения первого future. |
RaceOk | Future, который ожидает завершения первого успешного future. |
TryJoin | Future, который ожидает успешного завершения всех future или досрочно прерывается при ошибке. |
Zip | Поток, который "объединяет" несколько потоков в один поток пар. |
Примеры использования
Использование Join для ожидания нескольких future
#![allow(unused)] fn main() { use futures_concurrency::prelude::*; use std::future; let a = future::ready(1); let b = future::ready(2); let c = future::ready(3); let result = [a, b, c].join().await; assert_eq!(result, [1, 2, 3]); }
Использование TryJoin для обработки ошибок
#![allow(unused)] fn main() { use futures_concurrency::prelude::*; let a = async { Ok::<i32, &str>(1) }; let b = async { Ok::<i32, &str>(2) }; let c = async { Err::<i32, &str>("error") }; let result = [a, b, c].try_join().await; assert!(result.is_err()); }
Использование Race для гонки future
#![allow(unused)] fn main() { use futures_concurrency::prelude::*; use std::time::Duration; use tokio::time::sleep; let fast = async { 1 }; let slow = async { sleep(Duration::from_secs(1)).await; 2 }; let result = [fast, slow].race().await; assert_eq!(result, 1); }
Использование Merge для объединения потоков
#![allow(unused)] fn main() { use futures_concurrency::prelude::*; use tokio_stream::{self as stream, StreamExt}; let stream1 = stream::iter(vec![1, 2]); let stream2 = stream::iter(vec![3, 4]); let mut merged = [stream1, stream2].merge(); let mut results = Vec::new(); while let Some(value) = merged.next().await { results.push(value); } results.sort(); assert_eq!(results, vec![1, 2, 3, 4]); }
Использование Zip для параллельной обработки потоков
#![allow(unused)] fn main() { use futures_concurrency::prelude::*; use tokio_stream::{self as stream, StreamExt}; let stream1 = stream::iter(vec![1, 2, 3]); let stream2 = stream::iter(vec![4, 5, 6]); let mut zipped = [stream1, stream2].zip(); let mut results = Vec::new(); while let Some(values) = zipped.next().await { results.push(values); } assert_eq!(results, vec![[1, 4], [2, 5], [3, 6]]); }
Особенности работы с массивами
Модуль array предоставляет специализированные реализации для массивов фиксированной длины, что позволяет эффективно работать с известным на этапе компиляции количеством элементов. Это обеспечивает лучшую производительность и безопасность типов по сравнению с динамическими коллекциями.