我觉得rc::Weak可以使用(某种程度上) AsRef特性实现。我试图从一个弱指针中借用一些共享内容,但这不会编译:
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>是否有意义?发布于 2016-01-15 23:23:00
你不能借用弱引用,它是弱的,它不能保证底层对象存在(这就是为什么upgrade()返回一个Option)。即使幸运的是,在通过弱引用(upgrade()返回的Some)访问它的时候,值仍然是活动的,但一旦upgraded引用超出范围,就可以立即释放它。
为了获得对底层值的引用,您需要一些可以使其保持活力的东西(例如,强引用),但这意味着您必须将它与引用一起返回。
https://stackoverflow.com/questions/34821389
复制相似问题