Spec-Zone.ru › Tokio

Структура SetOnce

pub struct SetOnce<T> { /* private fields */ }
Доступно только при включённой функции crate sync.

Потокобезопасная ячейка, в которую можно записать значение только один раз.

SetOnce вдохновлён типом asyncio.Event из Python. Его можно использовать, чтобы ожидать установки значения SetOnce, подобно механизму «события».

Пример

use tokio::sync::{SetOnce, SetOnceError};

static ONCE: SetOnce<u32> = SetOnce::const_new();


// set the value inside a task somewhere...
tokio::spawn(async move { ONCE.set(20) });

// checking with .get doesn't block main thread
println!("{:?}", ONCE.get());

// wait until the value is set, blocks the thread
println!("{:?}", ONCE.wait().await);

Ok(())

SetOnce обычно используется для глобальных переменных, которые нужно инициализировать при первом использовании, но которые больше не требуется изменять. SetOnce в Tokio позволяет выполнять процедуру инициализации асинхронно.

Пример

use tokio::sync::{SetOnce, SetOnceError};
use std::sync::Arc;

let once = SetOnce::new();

let arc = Arc::new(once);
let first_cl = Arc::clone(&arc);
let second_cl = Arc::clone(&arc);

// set the value inside a task
tokio::spawn(async move { first_cl.set(20) }).await.unwrap()?;

// wait inside task to not block the main thread
tokio::spawn(async move {
    // wait inside async context for the value to be set
    assert_eq!(*second_cl.wait().await, 20);
}).await.unwrap();

// subsequent set calls will fail
assert!(arc.set(30).is_err());

println!("{:?}", arc.get());

Ok(())

Реализации

impl<T> SetOnce<T>

pub fn new() -> Self

Создаёт новый пустой экземпляр SetOnce.

pub const fn const_new() -> Self

Создаёт новый пустой экземпляр SetOnce.

Эквивалентен SetOnce::new, но может использоваться в статических переменных.

При использовании нестабильной функции tracing нестабильная функция объект SetOnce, созданный с помощью const_new, не будет инструментирован. Поэтому он не будет виден в tokio-console. Если требуется инструментированный объект, для его создания следует использовать SetOnce::new.

Пример
use tokio::sync::{SetOnce, SetOnceError};

static ONCE: SetOnce<u32> = SetOnce::const_new();

fn get_global_integer() -> Result<Option<&'static u32>, SetOnceError<u32>> {
    ONCE.set(2)?;
    Ok(ONCE.get())
}

let result = get_global_integer()?;

assert_eq!(result, Some(&2));
Ok(())

pub fn new_with(value: Option<T>) -> Self

Создаёт новый SetOnce, содержащий переданное значение, если оно есть.

Если Option имеет значение None, это эквивалентно SetOnce::new.

pub const fn const_new_with(value: T) -> Self

Создаёт новый SetOnce, содержащий переданное значение.

Пример

При использовании нестабильной функции tracing нестабильная функция объект SetOnce, созданный с помощью const_new_with, не будет инструментирован. Поэтому он не будет виден в tokio-console. Если требуется инструментированный объект, для его создания следует использовать SetOnce::new_with.

use tokio::sync::SetOnce;

static ONCE: SetOnce<u32> = SetOnce::const_new_with(1);

fn get_global_integer() -> Option<&'static u32> {
    ONCE.get()
}

let result = get_global_integer();

assert_eq!(result, Some(&1));

pub fn initialized(&self) -> bool

Возвращает true, если SetOnce в данный момент содержит значение, и false в противном случае.

pub fn get(&self) -> Option<&T>

Возвращает ссылку на значение, хранящееся в SetOnce, или None, если SetOnce пуста.

pub fn set(&self, value: T) -> Result<(), SetOnceError<T>>

Устанавливает для SetOnce переданное значение, если SetOnce пуста.

Если SetOnce уже содержит значение, этот вызов завершится ошибкой SetOnceError.

pub fn into_inner(self) -> Option<T>

Извлекает значение из ячейки, уничтожая её. Возвращает None, если ячейка пуста.

pub async fn wait(&self) -> &T

Ожидает установки значения.

Если SetOnce уже инициализирован, метод немедленно вернёт значение.

Безопасность при отмене

Этот метод безопасен при отмене.

Реализации трейтов

impl<T: Clone> Clone for SetOnce<T>

fn clone(&self) -> SetOnce<T>

Возвращает копию значения. Подробнее
1.0.0 (const: unstable) ·

fn clone_from(&mut self, source: &Self)

Выполняет копирующее присваивание из source. Подробнее

impl<T: Debug> Debug for SetOnce<T>

fn fmt(&self, fmt: &mut Formatter<'_>) -> Result

Форматирует значение с помощью указанного форматтера. Подробнее

impl<T> Default for SetOnce<T>

fn default() -> SetOnce<T>

Возвращает «значение по умолчанию» для типа. Подробнее

impl<T> Drop for SetOnce<T>

fn drop(&mut self)

Выполняет деструктор для этого типа. Подробнее

fn pin_drop(self: Pin<&mut Self>)

🔬Это экспериментальный API, доступный только в nightly-сборке. (pin_ergonomics)
Выполняет деструктор для этого типа, но, в отличие от Drop::drop, требует, чтобы self был закреплён. Подробнее

impl<T: Eq> Eq for SetOnce<T>

impl<T> From<T> for SetOnce<T>

fn from(value: T) -> Self

Преобразует входное значение в значение этого типа.

impl<T: PartialEq> PartialEq for SetOnce<T>

fn eq(&self, other: &SetOnce<T>) -> bool

Оператор равенства ==. Подробнее
1.0.0 (const: unstable) ·

fn ne(&self, other: &Rhs) -> bool

Оператор неравенства !=. Подробнее

impl<T: Send> Send for SetOnce<T>

impl<T: Sync + Send> Sync for SetOnce<T>

Реализации авто-трейтов

impl<T> !Freeze for SetOnce<T>

impl<T> !RefUnwindSafe for SetOnce<T>

impl<T> Unpin for SetOnce<T>
where T: Unpin,

impl<T> UnsafeUnpin for SetOnce<T>
where T: UnsafeUnpin,

impl<T> UnwindSafe for SetOnce<T>
where T: UnwindSafe,

Универсальные реализации

impl<T> Any for T
where T: 'static + ?Sized,

fn type_id(&self) -> TypeId

Получает TypeId self. Подробнее

impl<T> Borrow<T> for T
where T: ?Sized,

fn borrow(&self) -> &T

Неизменяемо заимствует принадлежащее значение. Подробнее

impl<T> BorrowMut<T> for T
where T: ?Sized,

fn borrow_mut(&mut self) -> &mut T

Изменяемо заимствует принадлежащее значение. Подробнее

impl<T> CloneToUninit for T
where T: Clone,

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬Это экспериментальный API, доступный только в nightly-версии. (clone_to_uninit)
Выполняет копирование с присваиванием из self в dest. Подробнее

impl<T> From<!> for T

fn from(t: !) -> T

Преобразует входное значение в значение этого типа.

impl<T> From<T> for T

fn from(t: T) -> T

Возвращает аргумент без изменений.

impl<T> Instrument for T

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Инструментирует этот тип с помощью предоставленного Span и возвращает обёртку Instrumented. Подробнее

fn in_current_span(self) -> Instrumented<Self> ⓘ

Инструментирует этот тип с помощью текущего Span и возвращает обёртку Instrumented. Подробнее

impl<T, U> Into<U> for T
where U: From<T>,

fn into(self) -> U

Вызывает U::from(self).

То есть это преобразование выполняет то, что выберет реализация From<T> for U.

impl<T> ToOwned for T
where T: Clone,

type Owned = T

Тип, получаемый после перехода во владение.

fn to_owned(&self) -> T

Создаёт принадлежащие данные из заимствованных данных, обычно путём клонирования. Подробнее

fn clone_into(&self, target: &mut T)

Использует заимствованные данные для замены принадлежащих данных, обычно путём клонирования. Подробнее

impl<T, U> TryFrom<U> for T
where U: Into<T>,

type Error = Infallible

Тип, возвращаемый в случае ошибки преобразования.

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Выполняет преобразование.

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

type Error = <U as TryFrom<T>>::Error

Тип, возвращаемый в случае ошибки преобразования.

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Выполняет преобразование.

impl<T> WithSubscriber for T

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Присоединяет указанный Subscriber к этому типу и возвращает обёртку WithDispatch. Подробнее

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Присоединяет текущий по умолчанию Subscriber к этому типу и возвращает обёртку WithDispatch. Подробнее

MIT License
Copyright © Tokio Contributors
https://docs.rs/tokio/1.53.1/tokio/sync/struct.SetOnce.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API