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

Макрос ready

Источник: Документация futures-lite::ready

#![allow(unused)]
fn main() {
macro_rules! ready {
    ($e:expr $(,)?) => { ... };
}
}

Разворачивает Poll<T> или возвращает Pending.

Примеры

#![allow(unused)]
fn main() {
use futures_lite::{future, prelude::*, ready};
use std::pin::Pin;
use std::task::{Context, Poll};

fn do_poll(cx: &mut Context<'_>) -> Poll<()> {
    let mut fut = future::ready(42);
    let fut = Pin::new(&mut fut);

    let num = ready!(fut.poll(cx));
    // ... используем num

    Poll::Ready(())
}
}

Как работает

Вызов макроса ready! раскрывается в:

#![allow(unused)]
fn main() {
let num = match fut.poll(cx) {
    Poll::Ready(t) => t,
    Poll::Pending => return Poll::Pending,
};
}

Описание

Макрос ready! используется для упрощения работы с типами Poll<T> в асинхронном коде. Он позволяет:

  • Извлечь значение из Poll::Ready(T)
  • Немедленно вернуть Poll::Pending, если результат еще не готов

Это особенно полезно при реализации методов poll вручную, где необходимо последовательно опрашивать несколько фьючерсов или асинхронных операций.

Типичное использование

#![allow(unused)]
fn main() {
use futures_lite::ready;
use std::task::{Context, Poll};

fn poll_multiple_operations(
    cx: &mut Context<'_>,
) -> Poll<Result<(), MyError>> {
    // Опрашиваем первую операцию
    let result1 = ready!(self.op1.poll(cx))?;
    
    // Опрашиваем вторую операцию
    let result2 = ready!(self.op2.poll(cx))?;
    
    Poll::Ready(Ok(()))
}
}

Макрос автоматически обрабатывает распространение ошибок, если тип Poll содержит Result, и обеспечивает корректное возвращение управления при Poll::Pending.