Перечисление Poll<T>
Описание
Указывает, доступно ли значение или текущая задача была запланирована для получения пробуждения.
Возвращается методом Future::poll.
Варианты
Ready(T)
Доступность: 1.36.0
Представляет, что значение готово немедленно.
Pending
Доступность: 1.36.0
Представляет, что значение еще не готово.
Когда функция возвращает Pending, она также должна обеспечить, что текущая задача будет запланирована для пробуждения, когда можно будет сделать прогресс.
Методы
map
#![allow(unused)] fn main() { pub fn map<U, F>(self, f: F) -> Poll<U> where F: FnOnce(T) -> U, }
Преобразует Poll<T> в Poll<U>, применяя функцию к содержащемуся значению.
Доступность: 1.36.0
Примеры
Преобразует Poll<String> в Poll<usize>, потребляя оригинал:
#![allow(unused)] fn main() { let poll_some_string = Poll::Ready(String::from("Hello, World!")); // `Poll::map` принимает self *по значению*, потребляя `poll_some_string` let poll_some_len = poll_some_string.map(|s| s.len()); assert_eq!(poll_some_len, Poll::Ready(13)); }
is_ready
#![allow(unused)] fn main() { pub const fn is_ready(&self) -> bool }
Возвращает true, если опрос является значением Poll::Ready.
Доступность: 1.36.0 (const: 1.49.0)
Примеры
#![allow(unused)] fn main() { let x: Poll<u32> = Poll::Ready(2); assert_eq!(x.is_ready(), true); let x: Poll<u32> = Poll::Pending; assert_eq!(x.is_ready(), false); }
is_pending
#![allow(unused)] fn main() { pub const fn is_pending(&self) -> bool }
Возвращает true, если опрос является значением Pending.
Доступность: 1.36.0 (const: 1.49.0)
Примеры
#![allow(unused)] fn main() { let x: Poll<u32> = Poll::Ready(2); assert_eq!(x.is_pending(), false); let x: Poll<u32> = Poll::Pending; assert_eq!(x.is_pending(), true); }
Методы для Poll<Result<T, E>>
map_ok
#![allow(unused)] fn main() { pub fn map_ok<U, F>(self, f: F) -> Poll<Result<U, E>> where F: FnOnce(T) -> U, }
Преобразует Poll<Result<T, E>> в Poll<Result<U, E>>, применяя функцию к содержащемуся значению Poll::Ready(Ok), оставляя все другие варианты нетронутыми.
Доступность: 1.36.0
Примеры
#![allow(unused)] fn main() { let res: Poll<Result<u8, _>> = Poll::Ready("12".parse()); let squared = res.map_ok(|n| n * n); assert_eq!(squared, Poll::Ready(Ok(144))); }
map_err
#![allow(unused)] fn main() { pub fn map_err<U, F>(self, f: F) -> Poll<Result<T, U>> where F: FnOnce(E) -> U, }
Преобразует Poll::Ready<Result<T, E>> в Poll::Ready<Result<T, U>>, применяя функцию к содержащемуся значению Poll::Ready(Err), оставляя все другие варианты нетронутыми.
Доступность: 1.36.0
Примеры
#![allow(unused)] fn main() { let res: Poll<Result<u8, _>> = Poll::Ready("oops".parse()); let res = res.map_err(|_| 0_u8); assert_eq!(res, Poll::Ready(Err(0))); }
Методы для Poll<Option<Result<T, E>>>
map_ok
#![allow(unused)] fn main() { pub fn map_ok<U, F>(self, f: F) -> Poll<Option<Result<U, E>>> where F: FnOnce(T) -> U, }
Преобразует Poll<Option<Result<T, E>>> в Poll<Option<Result<U, E>>>, применяя функцию к содержащемуся значению Poll::Ready(Some(Ok)), оставляя все другие варианты нетронутыми.
Доступность: 1.51.0
Примеры
#![allow(unused)] fn main() { let res: Poll<Option<Result<u8, _>>> = Poll::Ready(Some("12".parse())); let squared = res.map_ok(|n| n * n); assert_eq!(squared, Poll::Ready(Some(Ok(144)))); }
map_err
#![allow(unused)] fn main() { pub fn map_err<U, F>(self, f: F) -> Poll<Option<Result<T, U>>> where F: FnOnce(E) -> U, }
Преобразует Poll::Ready<Option<Result<T, E>>> в Poll::Ready<Option<Result<T, F>>>, применяя функцию к содержащемуся значению Poll::Ready(Some(Err)), оставляя все другие варианты нетронутыми.
Доступность: 1.51.0
Примеры
#![allow(unused)] fn main() { let res: Poll<Option<Result<u8, _>>> = Poll::Ready(Some("oops".parse())); let res = res.map_err(|_| 0_u8); assert_eq!(res, Poll::Ready(Some(Err(0)))); }
Реализации трейтов
From<T> для Poll<T>
#![allow(unused)] fn main() { impl<T> From<T> for Poll<T> }
Перемещает значение в Poll::Ready, чтобы создать Poll<T>.
Пример
#![allow(unused)] fn main() { assert_eq!(Poll::from(true), Poll::Ready(true)); }
Clone
#![allow(unused)] fn main() { impl<T> Clone for Poll<T> where T: Clone }
Позволяет клонирование Poll<T>.
Debug
#![allow(unused)] fn main() { impl<T> Debug for Poll<T> where T: Debug }
Позволяет форматирование Poll<T> для отладки.
PartialEq и Eq
#![allow(unused)] fn main() { impl<T> PartialEq for Poll<T> where T: PartialEq impl<T> Eq for Poll<T> where T: Eq }
Реализует проверку на равенство для Poll<T>.
PartialOrd и Ord
#![allow(unused)] fn main() { impl<T> PartialOrd for Poll<T> where T: PartialOrd impl<T> Ord for Poll<T> where T: Ord }
Реализует сравнение для Poll<T>.
Hash
#![allow(unused)] fn main() { impl<T> Hash for Poll<T> where T: Hash }
Позволяет хеширование Poll<T>.
Copy
#![allow(unused)] fn main() { impl<T> Copy for Poll<T> where T: Copy }
Позволяет копирование Poll<T> по значению.
Экспериментальные реализации трейтов
Try для Poll<Result<T, E>> ⚡️
#![allow(unused)] fn main() { impl<T, E> Try for Poll<Result<T, E>> }
Экспериментальная реализация трейта Try для композиции операций.
Try для Poll<Option<Result<T, E>>> ⚡️
#![allow(unused)] fn main() { impl<T, E> Try for Poll<Option<Result<T, E>>> }
Экспериментальная реализация трейта Try для вложенных типов.
Автоматические реализации трейтов
Freeze for Poll<T>- может быть заморожен, еслиT: FreezeRefUnwindSafe for Poll<T>- безопасен для паники, еслиT: RefUnwindSafeSend for Poll<T>- может быть передан между потоками, еслиT: SendSync for Poll<T>- может быть разделен между потоками, еслиT: SyncUnpin for Poll<T>- может быть безопасно перемещено, еслиT: UnpinUnwindSafe for Poll<T>- безопасен для паники, еслиT: UnwindSafe
Назначение
Poll<T> используется для:
- Возврата состояния асинхронных операций
- Реализации Future-трейтов
- Управления потоком выполнения в асинхронном коде
- Кооперативной многозадачности