Структура Ref
pub struct Ref<'a, T> { /* private fields */ }
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> !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> BorrowMut<T> for Twhere T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
impl<T> Instrument for T
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
impl<P, T> Receiver for P
type Target = T
arbitrary_self_types)
impl<T> WithSubscriber for T
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
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