Как вернуть ссылку на временное значение? - PullRequest
0 голосов
/ 11 октября 2019

Привет, мне было интересно, как мне получить следующий код:

struct TimedCache<T> {
    data: RwLock<T>,
    f: fn() -> T,
}

impl<T> TimedCache<T> {
    fn get(&self) -> &T {
        &self.data.read().unwrap()
    }
}

Поскольку я получаю: cannot return reference to temporary value

1 Ответ

4 голосов
/ 11 октября 2019

Довольно надежно и просто, на самом деле - мы не возвращаем &T, а вместо этого мы возвращаем черту, которую реализует охранник, которая позволяет нам добраться до &T: Deref!

impl<T> TimedCache<T> {
    fn get(&self) -> impl Deref<Target = T> + '_ {
        let lock = self.data.read();
        lock.unwrap()
    }
}

Это имеет все преимущества наличия ссылки и ни одного из недостатков - вам даже не нужно знать, что вы на самом деле манипулируете защитой чтения RwLock. Внешне это выглядит как объект, реализующий deref().

Полный пример этого, включая пример использования, находится на игровой площадке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...