我覺得rc::Weak
可以使用(某種)AsRef
特徵實現。我想借用一個弱指針一些共享的內容,但是這不會編譯:從弱點借錢<T>
use std::rc::Weak;
struct Thing<T>(Weak<T>);
impl<T> Thing<T> {
fn as_ref(&self) -> Option<&T> {
self.0.upgrade().map(|rc| {
rc.as_ref()
})
}
// For clarity, without a confusing closure
fn unwrapped_as_ref(&self) -> &T {
self.0.upgrade().unwrap().as_ref()
}
}
我明白爲什麼:升級Rc
不下去了as_ref
電話。但在我看來,這聽起來很完美。一個可能的魔術使用unsafe
,它編譯:
impl<T> Thing<T> {
fn unwrapped_as_ref<'a>(&'a self) -> &'a T {
let rc = self.0.upgrade().unwrap();
unsafe {
std::mem::transmute(rc.as_ref())
}
}
}
所以:
- 有什麼缺點這個解決方案?聽起來不錯嗎?你能想到一個更簡單的替代方案嗎?
- 在標準庫中實現
as_ref(&self) -> Option<&T>
是否有意義?
我可能會失去一些至關重要的東西,但在我看來,這聽起來不太可能。只要你的'as_ref'函數退出,升級後的引用就被銷燬了,所以不能保證數據沒有被釋放,你不能引用它。 – kirelagin