Довольно надежно и просто, на самом деле - мы не возвращаем &T
, а вместо этого мы возвращаем черту, которую реализует охранник, которая позволяет нам добраться до &T
: Deref
!
impl<T> TimedCache<T> {
fn get(&self) -> impl Deref<Target = T> + '_ {
let lock = self.data.read();
lock.unwrap()
}
}
Это имеет все преимущества наличия ссылки и ни одного из недостатков - вам даже не нужно знать, что вы на самом деле манипулируете защитой чтения RwLock
. Внешне это выглядит как объект, реализующий deref()
.
Полный пример этого, включая пример использования, находится на игровой площадке