Перечисление 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: Freeze
  • RefUnwindSafe for Poll<T> - безопасен для паники, если T: RefUnwindSafe
  • Send for Poll<T> - может быть передан между потоками, если T: Send
  • Sync for Poll<T> - может быть разделен между потоками, если T: Sync
  • Unpin for Poll<T> - может быть безопасно перемещено, если T: Unpin
  • UnwindSafe for Poll<T> - безопасен для паники, если T: UnwindSafe

Назначение

Poll<T> используется для:

  • Возврата состояния асинхронных операций
  • Реализации Future-трейтов
  • Управления потоком выполнения в асинхронном коде
  • Кооперативной многозадачности