Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Модуль array

Вспомогательные функции и типы для массивов фиксированной длины.

Структуры

ИмяОписание
AggregateErrorКоллекция ошибок.
ChainПоток, который объединяет несколько потоков один за другим.
JoinFuture, который ожидает завершения двух future схожего типа.
MergeПоток, который объединяет несколько потоков в один поток.
RaceFuture, который ожидает завершения первого future.
RaceOkFuture, который ожидает завершения первого успешного future.
TryJoinFuture, который ожидает успешного завершения всех 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 предоставляет специализированные реализации для массивов фиксированной длины, что позволяет эффективно работать с известным на этапе компиляции количеством элементов. Это обеспечивает лучшую производительность и безопасность типов по сравнению с динамическими коллекциями.