Возможно ли иметь кратковременную ссылку Rust, которая возвращает None, если объект был деконструирован?

#rust

#Ржавчина

Вопрос:

Могу ли я иметь что-то вроде

 struct LongLivedStruct { // lasts for a long time
    possibleRef: ShortLivedRc<SomeTrait> // SomeTrait will be freed soon
}
  

так что я могу попытаться разыменовать его позже:

 impl LongLivedStruct  {
    fn try_to_do_something(amp;self) -> amp;str {
        match amp;self.possibleRef.try_deref() {
            Ok(_) => "Value still exists, we can do something with it!"
            Err(_) => "Value has already been deconstructed"
        }
    }
}
  

без паники, если он больше не существует?

Ответ №1:

Мне кажется, что вы можете сделать это со слабой ссылкой.

Вы можете создать слабую ссылку для хранения в вашем LongLivedStruct , вызвав Rc::downgrade для Rc вашего SomeTrait объекта и сохранить его в вашем LongLivedStruct .

Затем вы можете вернуть его, вызвав для него Weak::upgrade, чтобы получить Option<Rc<SomeTrait>> ответ.