Spec-Zone.ru › Tokio

Структура Ref

pub struct Ref<'a, T> { /* private fields */ }
Доступно только при включённой возможности крейта crate feature sync.

Возвращает ссылку на внутреннее значение.

Незавершённые заимствования удерживают блокировку чтения внутреннего значения. Это означает, что длительные заимствования могут привести к блокировке производителя. Рекомендуется по возможности ограничивать время жизни заимствования. Кроме того, если вы работаете в среде, допускающей !Send futures, необходимо следить за тем, чтобы возвращённый тип Ref никогда не оставался действующим на протяжении точки .await, иначе это может привести к взаимной блокировке.

Политика приоритетов блокировки зависит от реализации базовой блокировки, и этот тип не гарантирует использование какой-либо конкретной политики. В частности, производитель, ожидающий получения блокировки в send, может как блокировать, так и не блокировать параллельные вызовы borrow, например:

Пример возможной взаимной блокировки
// Task 1 (on thread A)    |  // Task 2 (on thread B)
let _ref1 = rx.borrow();   |
                           |  // will block
                           |  let _ = tx.send(());
// may deadlock            |
let _ref2 = rx.borrow();   |

Реализации

impl<'a, T> Ref<'a, T>

pub fn has_changed(&self) -> bool

Показывает, считается ли заимствованное значение изменённым с момента последней отметки о просмотре.

В отличие от Receiver::has_changed(), этот метод не завершается ошибкой, если канал закрыт.

При заимствовании из Sender эта функция всегда возвращает false.

Примеры
use tokio::sync::watch;

let (tx, mut rx) = watch::channel("hello");

tx.send("goodbye").unwrap();
// The sender does never consider the value as changed.
assert!(!tx.borrow().has_changed());

// Drop the sender immediately, just for testing purposes.
drop(tx);

// Even if the sender has already been dropped...
assert!(rx.has_changed().is_err());
// ...the modified value is still readable and detected as changed.
assert_eq!(*rx.borrow(), "goodbye");
assert!(rx.borrow().has_changed());

// Read the changed value and mark it as seen.
{
    let received = rx.borrow_and_update();
    assert_eq!(*received, "goodbye");
    assert!(received.has_changed());
    // Release the read lock when leaving this scope.
}

// Now the value has already been marked as seen and could
// never be modified again (after the sender has been dropped).
assert!(!rx.borrow().has_changed());

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

impl<'a, T: Debug> Debug for Ref<'a, T>

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

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

impl<T> Deref for Ref<'_, T>

type Target = T

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

fn deref(&self) -> &T

Разыменовывает значение.

Автоматические реализации трейтов

impl<'a, T> !RefUnwindSafe for Ref<'a, T>

impl<'a, T> !Send for Ref<'a, T>

impl<'a, T> !UnwindSafe for Ref<'a, T>

impl<'a, T> Freeze for Ref<'a, T>

impl<'a, T> Sync for Ref<'a, T>
where T: Sync,

impl<'a, T> Unpin for Ref<'a, T>

impl<'a, T> UnsafeUnpin for Ref<'a, T>

Обобщённые реализации

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> 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> ⓘ

Инструментирует этот тип с помощью current 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<P, T> Receiver for P
where P: Deref<Target = T> + ?Sized, T: ?Sized,

type Target = T

🔬Это экспериментальный API, доступный только в nightly. (arbitrary_self_types)
Целевой тип, для которого может быть вызван метод.

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/watch/struct.Ref.html

Spec-Zone.ru

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