Макрос ready!
Описание
Макрос ready! извлекает успешное значение из Poll<T> и обеспечивает распространение сигналов Pending путем досрочного возврата.
Синтаксис
#![allow(unused)] fn main() { ready!(expression) }
Параметры
expression- выражение, возвращающееPoll<T>
Возвращаемое значение
- Если выражение возвращает
Poll::Ready(t), макрос возвращаетt - Если выражение возвращает
Poll::Pending, макрос выполняетreturn Poll::Pending
Пример использования
#![allow(unused)] fn main() { use std::task::{ready, Context, Poll}; use std::future::{self, Future}; use std::pin::Pin; pub 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::Ready - Автоматически обработать
Poll::Pendingс возвратом - Упростить код с цепочкой асинхронных операций
Примечания
- Макрос определен в модуле
std::task - Доступен начиная с Rust 1.64.0
- Часто используется в реализации Future-трайтов