Макрос 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.